正则表达式获取字母数字字符串之间的非字母数字字符串

时间:2019-05-16 16:29:00

标签: python regex

让我说说这个字符串:

Alpha+*&Numeric%$^String%%$

我想获取介于字母数字字符之间的非字母数字字符:

+*& %$^

我有这个正则表达式:[^0-9a-zA-Z]+,但它给了我

+* %$^ %%$

,其中包含我不需要的尾部非字母数字字符。我也尝试过[0-9a-zA-Z]([^0-9a-zA-Z])+[0-9a-zA-Z],但它给了我

a+*&N c%$^S

其中包括字符aNcS

2 个答案:

答案 0 :(得分:2)

如果您不介意将_字符用作字母数字数据,则可以使用以下命令提取所有非字母数字数据:

some_string = "A+*&N%$^S%%$"

import re
result = re.findall(r'\b\W+\b', some_string)  # sets result to:  ['+*&', '%$^']

请注意,我使用\b代替了\w[^\W]之类的东西。

\w[^\W]都匹配一个字符,因此,如果您的字母数字字符串(在您想要的文本之间)恰好是一个字符,那么您认为应该是下一个匹配项就不会匹配。

但是,由于\b是零宽度的“单词边界”,因此只要存在至少一个字母数字字符,它就不会在乎。

答案 1 :(得分:1)

您第二次尝试的唯一问题是+限定词的位置-它应该在括号内。您还可以使用单词字符类\w及其反符号\W提取这些项目,与第二个正则表达式相同,但包括下划线_作为单词的一部分:

import re

s = "Alpha+*&Numeric%$^String%%$"

print(re.findall(r"\w(\W+)\w", s))                             # adds _ character
print(re.findall(r"[0-9a-zA-Z]([^0-9a-zA-Z]+)[0-9a-zA-Z]", s)) # your version fixed
print(re.findall(r"(?i)[0-9A-Z]([^0-9A-Z]+)[0-9A-Z]", s))      # same as above

输出:

['+*&', '%$^']
['+*&', '%$^']
['+*&', '%$^']
相关问题