正则表达式匹配模式的重复出现

时间:2016-04-27 21:04:24

标签: python regex

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

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'来自第二行; {{1}从第三个开始;和从最后一个开始的'1x1'。有人可以告诉我如何编写Python正则表达式搜索来捕获给定字符串中的无或一个或多个这种模式的出现?我已经在下面尝试了,它只捕获给定句子中模式的第一次或第二次出现。谢谢!

None

2 个答案:

答案 0 :(得分: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来获取多个匹配(或捕获的子串,但我建议的模式中没有捕获组)。您遇到的问题是您尝试将重复捕获与1次搜索操作相匹配。由于子串不是相邻的,胶合,你只有单一的结果。

答案 1 :(得分:1)

你可以这样做:

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']]