RegEx用于从两端删除非ASCII字符

Gan*_*ang 12 python regex

我必须使用此代码多次循环,是否有更好的方法?

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)

在这里,我们假设您可能只想过滤输入字符串左右两侧的那些特殊字符。

您可以在表达式中包括其他字符和边界,如果愿意,甚至可以将其修改/更改为更简单,更快的表达式。

在此处输入图片说明

RegEx描述图

此图显示了表达式的工作方式,您可以在此链接中可视化其他表达式:

在此处输入图片说明

如果您想在右侧添加其他边界,则只需执行以下操作:

([a-z0-9;.-]+)(.*)$
Run Code Online (Sandbox Code Playgroud)

或者甚至可以在捕获组的左侧和右侧列出您的特殊字符。

JavaScript测试

性能测试

该JavaScript代码段使用一个简单的循环显示了该表达式的性能。

Python测试

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)

  • 假设此([[a-z0-9; .-] +)(。*)`是此`^ \ W + | \ W + $`的逆,这是一个概念上的错误。实际的逆是此`(\ w (?:。* \ w)?)`其中$ 1成为新字符串。https://regex101.com/r/ySNdja/2 (2认同)

CAu*_*tin 10

您可以通过^在字符集的开头使用克拉字符来取反其内容来完成此操作。[^a-zA-Z0-9]将匹配任何非字母或数字的内容。

^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$
Run Code Online (Sandbox Code Playgroud)


bob*_*ble 6

要从开始/结尾修剪非单词字符(上部\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]*代替.* 演示