【问题标题】:How to find all matches using python regular expression finditer如何使用 python 正则表达式 finditer 查找所有匹配项
【发布时间】:2017-08-09 02:13:38
【问题描述】:

我正在寻找一种模式。我写了以下代码:

string = '000,001,100,001'
pattern = '(.*)00(.*),(.*)00(.*)'

for m in re.finditer(pattern, string):
    print(m.groups())

上面的代码返回 ('000,001,1', '', '', '1'),因为它错过了与组的匹配 ('', '0', '', '1,100,001')

我正在尝试锻炼连续行上“00”之前和之后的字符是否相同。我写的代码匹配 '000,001,100,001'。如何匹配 '000,001,100,001'。

后期如何获取匹配组?

【问题讨论】:

  • 那是因为克林星是贪婪的。如果你使用.*?,它是non-greedy
  • @WillemVanOnsem 如何包含贪婪和非贪婪结果。贪婪和非贪婪之间的匹配呢?
  • @WillemVanOnsem 表达式 r"(.*?)00(.*),(.*?)00(.*)", r"(.*?)00(.*),( .*)00(.*)", r"(.*)00(.*),(.*)00(.*)", r"(.*?)00(.*),(.*? )00(.*)" 都产生不同的匹配。如何迭代它们。所需的输出组是在它们之后和之前具有相同数量的字母的那些,它们是 ('0', '', '0', '') 和 ('', '0', '', '0' )

标签: python regex match


【解决方案1】:

评论:对于字符串 '2295051,2238451,2235301,1950522,2238451,3530333'
...您会看到,这些组在发生之前具有相同的位数,即 2 位数,而在它们发生之后,则为 1 位数

string = '2295051,2238451,2235301,1950522,2238451,3530333'  

_Step 1_  
pattern = '(\d+)'
Output: ('2295051',) ('2238451',) ('2235301',) ('1950522',) ('2238451',) ('3530333',)  

_Step 2_
pattern = '((\d\d)\d+)'  
Output: ('2295051', '22') ('2238451', '22') ('2235301', '22')  
        ('1950522', '19') ('2238451', '22') ('3530333', '35')  

_Step 3_
pattern = '((\d\d)\d+(\d))'
Output: ('2295051', '22', '1') ('2238451', '22', '1') ('2235301', '22', '1')  
('1950522', '19', '2') ('2238451', '22', '1') ('3530333', '35', '3')  

在文档re.html#module-re 中了解'+' 的含义。

评论:......我不明白它是如何做到的以及我如何使用它......

pattern = '((\d\d)\d+(\d))' 搜索子字符串,从 2 位 \d\d 开始,后跟任意位数,至少一位,最后是一位 \d。这种模式是通用的,匹配任何数字的子字符串,至少 len=4。


试试这个模式:

string = '000,001,100,001'
pattern = '((\d)00|00(\d))'

for m in re.finditer(pattern, string):
    print(m.groups())

输出

('000', '0', 无)
('001', 无, '1')
('100', '1', 无)
('001', 无, '1')

第一项000 同时具有之前之后

使用 Python:3.4.2 - re:2.2.1 测试
如果这对您有用,请返回并将您的问题标记为已回答,或评论为什么不这样做。

【讨论】:

  • 对于字符串 '2295051,2238451,2235301',我使用模式 '(.*?)9505(.*),(.*)3845(.*),(.*)3530 (.*)' 得到一个匹配谁的组是 ('22', '1', '22', '1', '22', '1')。您会看到,这些组在发生之前具有相同的位数,即 2 位数,而在它们发生之后,则为 1 位数。
  • 我看到您的代码生成了更多匹配项,但我不明白它是如何做到的以及如何使用它。对字符串 '2295051,2238451,2235301,1950522,2238451,3530333 使用模式 '(.*)9505(.*),(.*)3845(.*),(.*)3530(.*)' 时' 我只得到一个匹配项('2295051,2238451,2235301,1', '22', '22', '1', '', '333')。如何在所有匹配项之间进行迭代,包括贪婪匹配和非贪婪匹配(来自 Williams 评论)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
相关资源
最近更新 更多