【问题标题】:In Python, how can I loop over all the matches of a regular expression on a string?在 Python 中,如何遍历字符串上正则表达式的所有匹配项?
【发布时间】:2017-12-28 12:58:48
【问题描述】:

我想用与较长字符串中的模式匹配的子字符串做一些事情(不仅仅是替换)。如果赋值是一个返回值的表达式,就像在 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 中实现。是否有 python 等效项(不涉及带有 break 或 continue 语句的混乱混乱)?

【问题讨论】:

  • 答案取决于。你在循环什么?绝对没有一对一的映射,但肯定有 pythonic 等价物。如果您可以更精确地了解您想要的内容...因为就目前而言,这个问题太宽泛了。

标签: python for-loop while-loop


【解决方案1】:

您可能正在寻找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',)

【讨论】:

  • 这个只扫描字符串一次,所以一般情况下是行不通的;几乎对循环内字符串的任何更改都会破坏它,例如用具有不同长度的东西替换匹配的模式。
  • 也许你可以举一个例子来说明你想要的行为,并询问如何在 Python 中实现它。我不愿意玩“猜猜OP想要什么”。
  • 公平地说,OP 在循环中写入do something to the string, using the match object,
  • @PatrickT 准确地引用,OP 说“我想做一些事情...... with substrings”(强调我的)“with”是与“to”不同...具体来说,with substrings 不会自动暗示修改底层字符串。 ...然后,在评论中,OP 切换到“to”,但不清楚这是什么意思。如果想从旧字符串派生新字符串,则无需就地替换即可。这个问题还不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
相关资源
最近更新 更多