繁体   English   中英

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

[英]How to find certain words using regular expression in 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后跟任意三位数的字符串。 因此,第一个代码所需的 output 将是:

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

如何修复编译并获得正确的 output?

左右手边界模式( [\(\+][\)\+] )正在消耗它们匹配的文本,因此不会检测到连续匹配。

您可以使用环视解决问题,

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

细节

  • (?<=[(+]) - 一个正向的后视,匹配紧接在(+之前的位置
  • [XYZ] - XYZ
  • \d{3} - 三位数
  • (?=[)+]) - 一个肯定的前瞻,确保在当前位置的右侧有)+

请注意单词边界\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']

您的模式正在寻找:

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

它没有选择“Z101”,因为当您添加“Y”时,substring 不会紧跟在“(”或“+”之前。

一种选择是将 1 和 4 排除在模式之外。 在这个例子中,你会得到你想要的。 该模式将是 r'[XYZ]\d\d\d'。 但是,根据您的数据,这可能会在未来产生不同的问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM