【问题标题】:Regular expression to match repeated occurrence of a pattern匹配重复出现的模式的正则表达式
【发布时间】:2016-04-27 21:04:23
【问题描述】:

我有几个可能的输入字符串,如下所示:

Roll|N/A|300x60|(1x1)|AAA|BBB

Desktop|1x1|(1x1)|AAA|BBB

Desktop|NA|(NA)|AAA|BBB

Roll|N/A|N/A|(1x1)|AAA|BBB

从中,我正在尝试检测\d+x\d+ 类型的模式(例如,第一行的“300x60”、“1x1”;第二行的“1x1”、“1x1”;第三行的None ; 和最后一个的'1x1')。有人可以告诉我如何编写 Python 正则表达式搜索来捕获给定字符串中这种模式的 none 或一个或多个 出现吗?我已经在下面尝试过,它只捕获给定句子中模式的第一次或第二次出现。谢谢!

r = re.search('(\(?\d+x\d+\)?)+', my_str) 
r.group() # only gives me '320x50' for the first input above

【问题讨论】:

  • re.findall(pattern, test_str)r'\(?\d+x\d+\)?'r'\d+x\d+'
  • 只需使用re.findall 而不是re.search - 你甚至不需要分组括号
  • @WiktorStribiżew,谢谢!我应该删除这个问题还是留下它?
  • @user1330974 这完全取决于您。如果您认为这个问题不再有价值,您可以决定将其删除,但请注意,如果您在太短的时间内过于频繁地这样做,可能会导致问题被禁止。 (因此,如果这是您第一次删除,请不要担心)

标签: python regex


【解决方案1】:

你可以使用

import re
my_strs = ["Roll|N/A|300x60|(1x1)|AAA|BBB", "Desktop|1x1|(1x1)|AAA|BBB", "Desktop|NA|(NA)|AAA|BBB", "Roll|N/A|N/A|(1x1)|AAA|BBB"]
print([re.findall(r'\d+x\d+', s) for s in my_strs])
# => [['300x60', '1x1'], ['1x1', '1x1'], [], ['1x1']]

请参阅 IDEONE demoregex demo

重点是使用re.findall 来获取多个匹配项(或捕获的子字符串,但我建议的模式中没有捕获组)。您遇到的问题是您尝试将 repeated captures 与 1 个搜索操作进行匹配。由于子字符串不相邻、不粘合,因此您只有一个结果。

【讨论】:

  • Stribizew,谢谢。我现在明白我应该使用findall。 :)
【解决方案2】:

你可以这样做:

import re
input_strings = ['Roll|N/A|300x60|(1x1)|AAA|BBB', 'Desktop|1x1|(1x1)|AAA|BBB',\
                 'Desktop|NA|(NA)|AAA|BBB','Roll|N/A|N/A|(1x1)|AAA|BBB']

print [[ j if j else None for j in [re.findall('(\d+x\d+)', i)]  ][0] for i in input_strings ]

输出:

[['300x60', '1x1'], ['1x1', '1x1'], None, ['1x1']]

【讨论】:

  • 谢谢。我在下面接受了 Wiktor 的回答,因为他之前提交了。您的两个解决方案都有效。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多