gpt4 book ai didi

Python 正则表达式格式

转载 作者:太空狗 更新时间:2023-10-30 02:47:52 26 4
gpt4 key购买 nike

我正在尝试使用 Python 的 re 模块匹配一些字符串,但无法正确完成。我要处理的字符串看起来像这样(示例):

XY_efgh_1234_0040_rev_2_1_NC_asdf
XY_abcd_1122Ae_1150_rev2_1_NC
XY_efgh_0124e_50_NC
asdf_1980_2234a_2
XY_abcd_5098_2270_2_1_NC
PC_bos_7659Ae_1450sp_rev_2_1_NC_GRAPH

那里的模式不是恒定的,它可能会有所不同。这对我很重要:

  • 忘记字符串的开头,直到第一个数值。那不重要,我不需要这个,它应该从任何结果中删除。

  • 然后总是四位数字,它们后面可以跟字母字符(最多三个)。我需要这部分,已提取。

  • 然后,在一些下划线(也可能有减号)之后,是我需要的另一组数值,它总是二到四个(.. .and 后面也可能跟最多三个字母字符) .

  • 在此部分之后,由更多下划线分隔,可能其他数值很重要并且属于先前的值。里面可能还有字母字符......

  • 字符串的末尾可能包含类似"NC" 的内容,可能还有其他字符,这些并不重要,应该被删除。

所以,根据前面的例子,这就是我需要处理的:

('1234',   '0040_rev_2_1')
('1122Ae', '1150_rev2_1')
('0124e', '50')
('1980', '2234a_2')
('5098', '2270_2_1')
('7659Ae', '1450sp_rev_2_1')

...我从来没有在 RegEx 中做过这样的 if-and-ifnot 事情,这让我发疯。到目前为止,这是我所拥有的,但这并不是我所需要的:

pattern     = re.compile(
r"""
([0-9]{4}
[A-Z]{0,3})
[_-]{1,3}
([0-9]{2,4}
[0-9A-Z_-]{0,16})
""",
re.IGNORECASE |
re.VERBOSE
)

if re.search(pattern, string):
print re.findall(pattern, string)

当我在最后提到的示例中使用它时,这就是我得到的:

[(u'7659Ae', u'1450sp_rev_2_1_NC_GR')]

...几乎 我需要什么 - 但我不知道如何在最后排除这个 _NC_GR ,以及这种通过计数限制字符的简单方法就是不好。

对于这种情况,有人有好的有效解决方案吗?

最佳答案

您需要使用否定先行来匹配 后跟NC 的字符。稍微重新格式化您的正则表达式以显示分组:

pattern     = re.compile(r"""
( [0-9]{4} [A-Z]{0,3} )
[_-]{1,3}
( [0-9]{2,4} (?:[0-9A-Z_-](?!NC))* )
""", re.IGNORECASE | re.VERBOSE)

{0,16} 替换为粗体 * 量词,结果为:

>>> for match in pattern.findall(inputtext):
... print match
...
('1234', '0040_rev_2_1')
('1122Ae', '1150_rev2_1')
('0124e', '50')
('1980', '2234a_2')
('5098', '2270_2_1')
('7659Ae', '1450sp_rev_2_1')

所以(非捕获)组 (?:[0-9A-Z_-](?!NC)) 匹配任何数字、字母、下划线或破折号后面没有跟字符 NC

关于Python 正则表达式格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15508442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com