Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 匹配重复出现的模式的正则表达式_Python_Regex - Fatal编程技术网

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
:)非常感谢。我接受了维克托下面的回答,因为他早些时候提交了。两种解决方案都有效。再次感谢!