我们说字符串pattern
就像(\d+)(X|Y|Z)(!|#)?
一样
digits
出现=> X or Y or Z
中的一个出现=> ! or #
并不总是出现。
我想解析字符串并希望返回列表。
ex1)str = 238Z!32Z#11234X
我想返回[238Z!,32Z#,11234X]
ex2)str = 91X92Y93Z
我想返回[91X,92Y,93Z]
下面是我的代码。
# your code goes here
import re
p=re.compile('^(\d+)(X|Y|Z)(!|#)?$')
L=p.findall("238Z!32Z!11234X")
print(L)
但我得到了空列表[]
我怎么了?
答案 0 :(得分:0)
请勿在正则表达式中使用^
和$
。 ^
匹配行首,$
匹配行尾。这意味着你的正则表达式只匹配开始和结束一行的字符串。
import re
p=re.compile('(\d+)(X|Y|Z)(!|#)?')
L=p.findall("238Z!32Z!11234X")
print(L)
输出:
[('238', 'Z', '!'), ('32', 'Z', '!'), ('11234', 'X', '')]
如果您不想获得元组,而是匹配完整的字符串,请不要使用捕获组:
p=re.compile('(?:\d+)(?:X|Y|Z)(?:!|#)?')
输出:
['238Z!', '32Z!', '11234X']
答案 1 :(得分:0)
首先,^
和$
metacharacters用于匹配字符串的开头和结尾(不是模式)。因此,您必须删除它们,以便您的正则表达式可以找到所有相应的模式。
其次,如果您的模式至少包含一个,findall
函数将返回一个组列表。组由您的模式中的括号定义。您应该使用non-capturing group (?:...)
。
import re
p = re.compile('(?:\d+)(?:X|Y|Z)(?:!|#)?')
L = p.findall("238Z!32Z!11234X")
print(L)
# ['238Z!', '32Z!', '11234X']
编写正则表达式时的另一个建议。如果您想匹配字符列表,则不需要(a|b|c)
,您可以使用具有相同含义的[abc]
。
此外,如果要量化单个元素,则不需要使用括号。 (\d+)
相当于\d+
,您将不再有任何群组问题。
你的正则表达式会变成:
\d+[XYZ][!#]?
答案 2 :(得分:0)
您不应使用^
或$
锚点,因为它们会要求您的字符串与一种模式完全匹配。
如果您想获得所需的结果,也不要使用捕获组:
p=re.compile('\d+[XYZ][!#]?')
[' 238Z!',' 32Z!',' 11234X']