Python 匹配重复出现的模式的正则表达式
我有几个可能的输入字符串,如下所示:Python 匹配重复出现的模式的正则表达式,python,regex,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”;第三行的“无”;最后一行的“1x1”)。有人能告诉我如何编写Python正则表达式搜索来捕获给定字符串中此类模式的一个或多
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”;第三行的“无”;最后一行的“1x1”)。有人能告诉我如何编写Python正则表达式搜索来捕获给定字符串中此类模式的一个或多个出现?我已经在下面试过了,它只捕获了给定句子中模式的第一次或第二次出现。谢谢大家!
r = re.search('(\(?\d+x\d+\)?)+', my_str)
r.group() # only gives me '320x50' for the first input above
你可以用
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']]
请参阅和
要点是使用将获取多个匹配项(或捕获的子字符串,但我建议的模式中没有捕获组)的。您遇到的问题是,您试图用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']]
re.findall(pattern,test\u str)
与r'\(?\d+x\d+\)?'
或r'\d+x\d+'
只需使用re.findall
而不是re.search
-您甚至不需要分组parenthesis@WiktorStribiżew,谢谢你!我应该删除这个问题还是留下它?@user1330974这完全取决于你。如果你认为这个问题不再有价值,你可以决定删除它,但要注意,如果你在太短的时间内经常这样做,可能会被禁止提问。(因此,如果这是您第一次删除;不要担心)Stribizuw,谢谢。我现在明白我应该使用findall
:)非常感谢。我接受了维克托下面的回答,因为他早些时候提交了。两种解决方案都有效。再次感谢!