【问题标题】:regular expressions (regex) save parts of sentence正则表达式 (regex) 保存部分句子
【发布时间】:2018-05-12 13:09:52
【问题描述】:

python 和正则表达式的新手,我一直在尝试找到一种方法来解析一个句子,以便我可以提取其中的一部分并将它们分配给它们自己的变量。

例句:Laura Compton,来自加利福尼亚州洛杉矶的股票经纪人

我的目标是有:name = "Laura Compton"(这个很简单,我可以定位锚链接没问题),position = "Stock Broker",city = Los Angeles,state = California

我需要迭代的所有句子都遵循相同的模式,名称总是在锚标记中,位置总是跟随在结束锚之后,有时它使用“a”或“an”所以我想剥去那些。城市和州始终遵循“来自”这个词。

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    你可以试试这个:

    import re
    s = "Laura Compton, a Stock Broker from Los Angeles, California"
    new_s = re.findall('^[a-zA-Z\s]+|(?<=a\s)[a-zA-Z\s]+(?=from)|(?<=an\s)[a-zA-Z\s]+(?=from)|(?<=from\s)[a-zA-Z\s]+(?=,)|(?<=,\s)[a-zA-Z\s]+$', s)
    headers = ['name', 'title', 'city', 'state']
    data = {a:b for a, b in zip(headers, new_s)}
    

    输出:

    {'city': 'Los Angeles', 'state': 'California', 'name': 'Laura Compton', 'title': 'Stock Broker '}
    

    【讨论】:

      【解决方案2】:

      您可以在模式中使用命名组来捕获子字符串,这样可以更轻松地引用它们,并且这样做的代码更具可读性:

      import re
      
      data = ['Laura Compton, a Stock Broker from Los Angeles, California',
              'Miles Miller, a Soccer Player from Seattle, Washington']
      
      pattern = (r'^(?P<name>[^,]+)\, an? (?P<position>.+) from '
                 r'(?P<city>[^,]+)\, +(?P<state>.+)')
      
      FIELDS = 'name', 'position', 'city', 'state'
      
      for sentence in data:
          matches = re.search(pattern, sentence)
          name, position, city, state = matches.group(*FIELDS)
          print(', '.join([name, position, city, state]))
      

      样本data产生的输出:

      Laura Compton, Stock Broker, Los Angeles, California
      Miles Miller, Soccer Player, Seattle, Washington
      

      上午Kuchling 写了一篇很好的教程,标题为Regular Expression HOWTOyou should check-out。

      【讨论】:

      • 如果pattern 被重复使用,在这里编译可能会很聪明。
      • @BradSolomon:不是因为re 模块会自动缓存最近使用的正则表达式的编译版本——所以使用频率通常无关紧要。
      • 我猜你是对的@martineau。所以真正在 3.x 中使用 compile 的唯一原因是给定 here 的第二个原因?
      • @Brad:我想是的,就我个人而言,我很少打扰,因为它通常不值得麻烦。编译正则表达式通常是整个处理过程中非常微不足道的一部分,所以即使它没有自动缓存它们并且发生了很多次,我也不会太担心。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多