【问题标题】:Capture all repetitions of a group using Python regular expression使用 Python 正则表达式捕获组的所有重复
【发布时间】:2014-02-09 20:09:32
【问题描述】:

我有以下格式的输入:

<integer>: <word> ... # <comment>

其中... 可以表示一个或多个&lt;word&gt; 字符串。

这是一个例子:

1: foo bar baz # This is an example

我想用正则表达式拆分这个输入并返回一个元组,其中包含每个单词后跟的整数。对于上面的例子,我想要:

(1, 'foo', 'bar', 'baz')

这是我尝试过的。

>>> re.match('(\d+):( \w+)+', '1: foo bar baz # This is an example').groups()
('1', ' baz')

我只得到整数和最后一个单词。如何获取正则表达式匹配的整数和所有单词?

【问题讨论】:

  • 有什么理由需要用正则表达式来做这个?
  • @Decency 我正在使用正则表达式来验证示例输入,所以我想我也可以使用它来提取我需要的令牌。
  • 问题是groups() 每组返回 一个 匹配。如果一个组进行了多次匹配,它只返回最后一个匹配(如您所见)。如果您想要全部内容,则必须使用 single 组,例如:(\d+):(( \w+)+)。然后你必须拆分外部组匹配的内容。

标签: python regex string


【解决方案1】:

非正则表达式解决方案:

>>> s = '1: foo bar baz # This is an example'
>>> a, _, b = s.partition(':')
>>> [int(a)] + b.partition('#')[0].split()
[1, 'foo', 'bar', 'baz']

【讨论】:

    【解决方案2】:

    您可以通过简单的字符串操作使其更清晰。

    my_string = '1: foo bar baz'
    num_string, word_string = my_string.split(':')
    num = int(num_string)
    words = word_string.strip().split(' ')
    
    print(num)
    print(words)
    

    输出:

    # num = 1
    # words = ['foo', 'bar', 'baz']
    

    【讨论】:

      【解决方案3】:

      这里的技巧是使用前瞻:让我们找到数字(后跟冒号)或单词(后跟字母/空格和哈希):

      s = "1: foo bar baz # This is an example"
      print re.findall(r'\d+(?=:)|\w+(?=[\w\s]*#)', s)
      # ['1', 'foo', 'bar', 'baz']
      

      剩下的唯一事情就是将"1" 转换为 int - 但你不能用正则表达式来做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-13
        • 2011-03-11
        • 2017-01-07
        • 2019-12-19
        • 1970-01-01
        • 2022-11-03
        • 2017-12-30
        相关资源
        最近更新 更多