在Python中,我如何循环遍历字符串上正则表达式的所有匹配项?

10

我希望对长字符串中匹配某个模式的子字符串进行处理(不仅仅是替换)。如果赋值操作是一个返回值的表达式,就像C语言和大多数其他编程语言一样,那么可以这样做(使用Python语义的C语法):

  while ( match = re.search( pat, str ) ) {
       /* do something to the string, using the match object,
          in addition to removing or replacing the substring
       */
    }

更详细地说,避免将赋值作为表达式使用:
for ( match = re.search( pat, str );
      match;
      match = re.search( pat, str ) ) {
   /* do something to the string, using the match object */
}

在大多数编程语言中,至少有一种方式可以实现以下操作:C、C++、Java、Perl、Javascript等等,但是在Python中似乎没有这样的方法。是否有一种Pythonic的等效方法(不涉及使用break或continue语句的混乱解决方案)?

2
答案取决于你正在循环什么?绝对没有一对一的映射,但肯定有Python等效项。如果你能更精确地说明你想要什么...因为目前这个问题太宽泛了。 - cs95
1个回答

9

您可能正在寻找finditer

返回一个迭代器,该迭代器在字符串中以RE模式找到的所有非重叠匹配项上生成匹配对象。 字符串从左到右扫描,并按找到的顺序返回匹配项。 除非它们接触到另一次匹配的开头,否则空匹配将包含在结果中。

#!/usr/bin/env python3

import re

s = "abcabcabc";
it = re.finditer("(\w)", s)
for m in it:
    print(m.groups())

 $ ./t.py
('a',)
('b',)
('c',)
('a',)
('b',)
('c',)
('a',)
('b',)
('c',)

1
这只扫描了一次字符串,因此在一般情况下它不起作用;几乎任何循环内对字符串的更改都会破坏它,例如将匹配的模式替换为长度不同的内容。 - zizzler
也许你可以举个例子来说明你想要的行为,并询问如何在Python中实现它。我不愿意玩“猜测OP想要什么”的游戏。 - Sinan Ünür
公平地说,OP在循环内部写了使用匹配对象对字符串进行操作 - PatrickT
@PatrickT 引用原话,OP说:“我想做一些事情...与子字符串一起”(强调是我的)“与”不同于“对”...具体来说,使用子字符串做某些事情并不自动意味着修改基础字符串。...然后,在评论中,OP切换到“对”,但不清楚这是什么意思。如果想从旧字符串派生出新字符串,可以在不进行就地替换的情况下完成。问题仍然不清楚。 - Sinan Ünür

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接