我正在用Python学习正则表达式的诀窍。我的代码如下:
import re
test = '"(Z101+Z102+Z1034+Z104)/4"'
regex = re.compile(r"[\(\+]([XYZ]\d\d\d)[\)\+]")
regex.findall(test)
它返回:
['Z101', 'Z104']
但是,当我将“Z101”更改为“YZ101”时:
import re
test = '"(YZ101+Z102+Z1034+Z104)/4"'
regex = re.compile(r"[\(\+]([XYZ]\d\d\d)[\)\+]")
regex.findall(test)
它返回:
['Z102', 'Z104']
其目的是提取包含X
、Y
或Z
后跟任意三位数字集的字符串。因此,第一个代码的期望输出为:
['Z101', 'Z102', 'Z104']
如何修复编译并获得正确的输出
您的模式正在寻找:
它没有选择“Z101”,因为当您添加“Y”时,该子字符串的前面不会紧跟着“(”或“+”)
一个选项是在模式中保留1和4。在本例中,您将完全得到您想要的。该模式将是r'[XYZ]\d\d\d。但是,根据您的数据,这可能会产生不同的问题
另一个选项是包含前缀字符带“?”的可能性。当用作量词时,“?”表示“零或一”(但它也可以修改其他量词,但这是另一个主题)。为此,您的模式将是r“[(+][XYZ]?([XYZ]\d\d\d)[)+]”
左侧和右侧边界模式(
[\(\+]
和[\)\+]
)正在使用它们匹配的文本,因此不会检测到连续的匹配你可以解决这个问题using lookarounds
详细信息
(?<=[(+])
-与指定位置匹配的正向查找 前面紧跟着(
或+
[XYZ]
-X
、Y
或Z
\d{3}
-三位数字(?=[)+])
-一个积极的前瞻,确保当前位置右侧立即有)
或+
李>注意word boundary,
\b
,在某些情况下可以解决这个问题,在这里它也可能对您有所帮助将
re.findall
与模式[XYZ]\d{3}\b
一起使用:相关问题 更多 >
编程相关推荐