python3使用正则表达式解析字符串(包含'*')

时间:2017-09-16 07:08:29

标签: python regex

我们说字符串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)

但我得到了空列表[] 我怎么了?

3 个答案:

答案 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']