我必须使用此代码多次循环,是否有更好的方法?
item = '!@#$abc-123-4;5.def)(*&^;\n'
Run Code Online (Sandbox Code Playgroud)
要么
'!@#$abc-123-4;5.def)(*&^;\n_'
Run Code Online (Sandbox Code Playgroud)
要么
'!@#$abc-123-4;5.def)_(*&^;\n_'
Run Code Online (Sandbox Code Playgroud)
我这样的人没有用
item = re.sub('^\W|\W$', '', item)
Run Code Online (Sandbox Code Playgroud)
期望
abc-123-4;5.def
Run Code Online (Sandbox Code Playgroud)
最终目标是[a-zA-Z0-9]在两端之间保留所有字符的同时,仅从两端除去所有不包含的字符。第一个和最后一个字母在上课[a-zA-Z0-9]
Emm*_*mma 13
如果所需的所有字符都与问题中提供的示例相似,则此表达式不受左侧限制,并且执行速度可能更快:
([a-z0-9;.-]+)(.*)
Run Code Online (Sandbox Code Playgroud)
在这里,我们假设您可能只想过滤输入字符串左右两侧的那些特殊字符。
您可以在表达式中包括其他字符和边界,如果愿意,甚至可以将其修改/更改为更简单,更快的表达式。
此图显示了表达式的工作方式,您可以在此链接中可视化其他表达式:
如果您想在右侧添加其他边界,则只需执行以下操作:
([a-z0-9;.-]+)(.*)$
Run Code Online (Sandbox Code Playgroud)
或者甚至可以在捕获组的左侧和右侧列出您的特殊字符。
([a-z0-9;.-]+)(.*)
Run Code Online (Sandbox Code Playgroud)
该JavaScript代码段使用一个简单的循环显示了该表达式的性能。
([a-z0-9;.-]+)(.*)$
Run Code Online (Sandbox Code Playgroud)
import re
regex = r"([a-z0-9;.-]+)(.*)$"
test_str = "!@#$abc-123-4;5.def)(*&^;\\n"
print(re.findall(regex, test_str))
Run Code Online (Sandbox Code Playgroud)
[('abc-123-4;5.def', ')(*&^;\\n')]
Run Code Online (Sandbox Code Playgroud)
CAu*_*tin 10
您可以通过^在字符集的开头使用克拉字符来取反其内容来完成此操作。[^a-zA-Z0-9]将匹配任何非字母或数字的内容。
^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$
Run Code Online (Sandbox Code Playgroud)
要从开始/结尾修剪非单词字符(上部\W),但还要添加属于单词字符 的下划线,[A-Za-z0-9_]您可以将和一起_放到字符类中\W。
^[\W_]+|[\W_]+$
Run Code Online (Sandbox Code Playgroud)
请参阅regex101上的演示。这与@CAustin的答案和@sln的评论非常相似。
要获取反演示并匹配从第一个到最后一个字母数字字符的所有内容:
[^\W_](?:.*[^\W_])?
Run Code Online (Sandbox Code Playgroud)
或使用交替演示(|[^\W_]对于其中仅包含一个数字的字符串)。
[^\W_].*[^\W_]|[^\W_]
Run Code Online (Sandbox Code Playgroud)
两者都re.DOTALL用于多行字符串。正则表达式口味无需尝试即可[\s\S]*代替.* 演示