如何在python中使用正则表达式查找某些单词?

2024-05-15 01:09:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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']

其目的是提取包含XYZ后跟任意三位数字集的字符串。因此,第一个代码的期望输出为:

['Z101', 'Z102', 'Z104']

如何修复编译并获得正确的输出


Tags: 代码testimport目的reregexcompilexyz
3条回答

您的模式正在寻找:

  1. “(”或“+”
  2. 正好是“X”、“Y”或“Z”中的一个
  3. 正好是三个数字字符
  4. “(”或“+”

它没有选择“Z101”,因为当您添加“Y”时,该子字符串的前面不会紧跟着“(”或“+”)

一个选项是在模式中保留1和4。在本例中,您将完全得到您想要的。该模式将是r'[XYZ]\d\d\d。但是,根据您的数据,这可能会产生不同的问题

另一个选项是包含前缀字符带“?”的可能性。当用作量词时,“?”表示“零或一”(但它也可以修改其他量词,但这是另一个主题)。为此,您的模式将是r“[(+][XYZ]?([XYZ]\d\d\d)[)+]”

左侧和右侧边界模式([\(\+][\)\+])正在使用它们匹配的文本,因此不会检测到连续的匹配

你可以解决这个问题using lookarounds

r"(?<=[(+])([XYZ]\d\d\d)(?=[)+])"
r"(?<=[(+])[XYZ]\d{3}(?=[)+])"

详细信息

  • (?<=[(+])-与指定位置匹配的正向查找 前面紧跟着(+
  • [XYZ]-XYZ
  • \d{3}-三位数字
  • (?=[)+])-一个积极的前瞻,确保当前位置右侧立即有)+

注意word boundary\b,在某些情况下可以解决这个问题,在这里它也可能对您有所帮助

re.findall与模式[XYZ]\d{3}\b一起使用:

test = '"(YZ101+Z102+Z1034+Z104)/4"'
matches = re.findall(r'[XYZ]\d{3}\b', test)
print(matches)  # ['Z101', 'Z102', 'Z104']

相关问题 更多 >

    热门问题