【问题标题】:Python - match a word in a string with a list of stringsPython - 将字符串中的单词与字符串列表匹配
【发布时间】:2015-05-06 07:09:24
【问题描述】:

我是 python 新手,我想知道字符串比较是如何完成的

假设我有一个包含状态名称的字符串列表,例如

states = ["New York", "California", "Nebraska", "Idaho"]

我还有另一个字符串,其中包含类似的地址

postal_addr = "1234 1st E St San Jose California 95112"

如何解析此地址字符串并找到与状态列表中的项目匹配的项?在上面的示例中,加利福尼亚将是一个匹配项。匹配后如何提取"California"并将其存储为单独的字符串?

【问题讨论】:

  • 我认为我们需要更多细节。例如,"The New Yorker" 是否也应该匹配? 123 Idaho St., Farmville, Nebraska 67890 这样的地址呢?
  • 你应该先尝试然后寻求帮助。否则我们有感觉做你的功课。
  • 您正在寻找fuzzy string matching。
  • 在我的情况下不会出现这种问题。因为州名在字符串中只出现一次,不会出现像“Idaho St”这样的场景

标签: python string list


【解决方案1】:

我愿意

matches = [ s for s in states if s in postal_addr ]

那么,如果你想从邮政地址中获取字符串:

import re
if matches:
    extracted = re.findall( matches[0],  postal_addr)[0]

编辑:..但这不适用于城市名称包含不同州的城市/州组合,例如 postal_adr = '1 Arrowhead Dr, Kansas City, Missouri 64129' 和 states = ["New York", "California", "Nebraska", "Idaho", "Missouri", "Kansas"] 等。在这种情况下

import re
if matches:
    extracted = [(re.search(m, postal_addr).start() , m) for m in matches ]
    extracted = sorted( extracted )[-1][1]

【讨论】:

  • 如果len(match)>0:不是很pythonic,你应该写if match:。来源:PEP8 部分编程建议。
【解决方案2】:
>>> states = ["New York", "California", "Nebraska", "Idaho"]
>>> postal_addr = "1234 1st E St San Jose California 95112"
>>> first_match = next(state for state in states if state in postal_addr)
>>> first_match
'California'

但是,如果您需要在单词边界处进行匹配,则最好使用正则表达式。

【讨论】:

    【解决方案3】:
    states = ["New York", "California", "Nebraska", "Idaho"]
    postal_addr = "1234 1st E St San Jose California 95112"
    
    result = None
    for state in states:
        if state in postal_addr:
            result = state
    
    print(result)
    

    很遗憾,这也会匹配包含州名称(例如 Idahoba)的单词。

    【讨论】:

      【解决方案4】:

      你可以这样试试,

      In [2]: states = ["New York", "California", "Nebraska", "Idaho"]
      
      In [3]: postal_addr = "1234 1st E St San Jose California 95112"
      
      In [4]: ''.join(state for state in states if state in postal_addr)
      Out[4]: 'California'
      

      【讨论】:

        【解决方案5】:

        这是另一个使用正则表达式的替代答案:

        import re
        
        states = ["New York", "California", "Nebraska", "Idaho"]
        pattern = re.compile(r'.*(' + r'|'.join(states) + ').*')
        
        postal_addr = "1234 1st E St San Jose California 95112"
        match = pattern.match(postal_addr)
        
        if match:
            state = match.group(1)
        

        【讨论】:

          【解决方案6】:

          要查找字符串中的所有匹配项,您可以这样做:

          matches = [m for m in postal_addr.split() if m in states]
          

          【讨论】:

          • 好点。这使得这个问题比快速响应(包括我的)所暗示的数量更难回答!
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-06-18
          • 1970-01-01
          • 2021-10-19
          • 2015-10-14
          • 1970-01-01
          • 2021-11-30
          • 1970-01-01
          相关资源
          最近更新 更多