【问题标题】:Got stuck with re.findall function for regular expressions [duplicate]被正则表达式的 re.findall 函数卡住了[重复]
【发布时间】:2020-09-14 21:36:38
【问题描述】:

我有一个字符串,看起来像

text = "customer: Anna Smith; payment: 123; date: 12-02-2020; customer: Jack; payment: 10.3; date: 20-03-2020"

现在我想把它变成一个元组列表(以后我可以用它来创建字典):

[('customer', 'Anna Smith'),
 ('payment', '123'),
 ('date', '12-02-2020'),
 ('customer', 'Jack'),
 ('payment', '10.3'),
 ('date', '20-03-2020')]

我尝试通过以下方式将 re.findall 用于此目的:

re.findall(u'(\w+): (.+?);', text)

当然,由于正则表达式中的分号,它不会捕获最后一对键和值。我认为我在这里需要一个 if-else if 操作:如果解析器遇到分号,那么它会提取单词,否则它会检查 EOL (\Z) 的正则表达式。请帮忙

【问题讨论】:

    标签: python regex python-re


    【解决方案1】:

    如果你也想匹配最后一个,使用这个模式(\w+): (.+?)(?:;|$)

    这与您的模式之间的唯一区别是它将接受以;$ 结尾的匹配项,这是行尾字符。

    Demo

    【讨论】:

      【解决方案2】:

      为了简单起见,我们还可以使用split 函数。

      arr = text.split("; ")
      result = []
      for a in arr:
          _ = a.split(": ")
          result.append((_[0], _[1]))
      

      现在result 列表包含您想要的输出

      【讨论】:

        【解决方案3】:

        不匹配;,而是将.+? 更改为[^;]+,这样它就可以匹配不是; 的所有内容。

        re.findall(r'(\w+): ([^;]+)', text)
        

        【讨论】:

        • 不适用于ru,将其更改为r 就可以了。
        • 原来在 Python 3 中字符串总是 Unicode,所以不需要u
        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2020-05-16
        • 2021-09-30
        • 2012-02-18
        • 2019-03-07
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多