【问题标题】:Help on Regular Expression problem正则表达式问题的帮助
【发布时间】:2010-07-23 22:04:44
【问题描述】:

我想知道是否可以为以下数据模式制作正则表达式:

'152:德系 A、Benlifer A、Korenblit J、Silberstein SD。'

string = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.'

我正在使用这个正则表达式(使用 Python 的 re 模块)来提取这些名称:

re.findall(r'(\d+): (.+), (.+), (.+), (.+).', string, re.M | re.S)

结果:

[('152', 'Ashkenazi A', 'Benlifer A', 'Korenblit J', 'Silberstein SD')]

现在尝试使用不同数量(小于 4 或大于 4)的名称数据模式不再有效,因为 RegEx 预计只能找到其中的 4 个:

(.+), (.+), (.+), (.+).

我找不到概括这种模式的方法。

【问题讨论】:

    标签: python regex unicode string


    【解决方案1】:

    正则表达式可能不是解决这个问题的最佳方法。你可以使用split():

    >>> s = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.'
    >>> s.split(": ")
    ['152', 'Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.']
    >>> s.split(": ")[1].split(", ")
    ['Ashkenazi A', 'Benlifer A', 'Korenblit J', 'Silberstein SD.']
    

    【讨论】:

    • 我正在考虑将此标记为我的问题的解决方案,但我会等着看其他人是否可以为我的问题提供纯正则表达式解决方案。只是好奇:)
    【解决方案2】:

    如果你只想要数字后面的东西,这应该可以解决问题:

    re.findall(r'\d+: (.+)(?:, .+)*\.', input, re.M | re.S)
    

    如果你想要一切:

    re.findall(r'(\d+): (.+)(?:, .+)*\.', input, re.M | re.S)
    

    如果你想把它们分成一个匹配列表,嵌套的正则表达式会做到这一点:

    re.findall(r'[^,]+,|[^,]+$', re.findall(r'\d+: (.+)(?:, .+)*\.', input, re.M | re.S)[0],re.M|re.S)
    

    【讨论】:

    • 奇数。相同的正则表达式对我有用。也就是说,在回顾他的输入后,最终的 . 应该是文字 \.
    • 啊,再看看我明白你的意思了(我想)。我已经进行了编辑,因此不包括无关的其他垃圾(除非他想要)。
    • 它有效,但我仍然需要用“.split(',')”分割名称。
    • 添加了另一个选项:此选项返回单个匹配项。
    • 我的结果是 ['Ashkenazi A,', 'Benlifer A,', ' Korenblit J,', ''],列表中缺少一个名字。
    【解决方案3】:

    如果你的意思是可能有更多(或更少)的名字,你也许应该尝试这样的事情: (\d+): (.+)*?星号 (*) 表示 (.+) 出现 0 次或多次

    【讨论】:

      【解决方案4】:

      我可以接近,但可能需要进一步处理。手动拆分字符串可能会更好,尤其是在数据格式可靠的情况下。

      代码

      import re
      string1 = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.'
      string2 = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD, Hattingh CJR.'
      for i in [string1, string2]:
          print re.findall(r'(\d+):|(?:[.,\s?])?(.*?)(?:[.,])', i)
      

      输出

      [('152', ''), ('', 'Ashkenazi A'), ('', 'Benlifer A'), ('', 'Korenblit J'), ('', 'Silberstein SD')]
      [('152', ''), ('', 'Ashkenazi A'), ('', 'Benlifer A'), ('', 'Korenblit J'), ('', 'Silberstein SD'), ('', 'Hattingh CJR')]
      

      编辑:使用 2 个表达式

      如果您愿意使用两个正则表达式,可以相当轻松地完成:

      import re
      string1 = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.'
      string2 = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD, Hattingh CJR.'
      for i in [string1, string2]:
          print re.findall(r'^(\d+):', i)
          print re.findall(r'(?:[:,] )(\S+ [A-Z]+)(?=[\.,])', i)
      

      生产

      ['152']
      ['Ashkenazi A', 'Benlifer A', 'Korenblit J', 'Silberstein SD']
      ['152']
      ['Ashkenazi A', 'Benlifer A', 'Korenblit J', 'Silberstein SD', 'Hattingh CJR']
      

      【讨论】:

      • 好吧,你确实接近了 :) 我几乎看不懂那个正则表达式!
      • 不错的解决方案! :) 它与@JGB146 类似,因为它需要多个正则表达式。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多