【问题标题】:Python Regular Expression to Identify City Names Out Of StringsPython 正则表达式从字符串中识别城市名称
【发布时间】:2015-01-23 13:35:20
【问题描述】:

在 Python 3.4 中使用正则表达式,如何从以下文本中提取城市名称?

replacement windows in seattle wa
basement remodeling houston texas
siding contractor new york ny
windows in elk grove village

有时城市名称前面有\sin\s,有时没有。有时它有一个通用词,如“窗户”、“改造”……任何东西。有时末尾没有州全名或州缩写。

是否有一个正则表达式可以捕获上述这些条件?

这是我迄今为止尝试过的,但它只捕获“西雅图”。

import re

l = ['replacement windows in seattle wa',
     'basement remodeling houston texas',
     'siding contractor new york ny',
     'windows in elk grove village'
    ]
for i in l:
    m = re.search(r'(?<=\sin\s)(.+)(?=\s(wa|texas|ny))', i)
    m.group(1)

【问题讨论】:

  • 我认为这通常是不可能的。使用城市名称列表。这些可以很容易地用谷歌等找到。将该列表变成一个集合并在该集合中查找各个标记。
  • @Jarad 一个单词的城市名称是可能的。 regex101.com/r/dZ1iN5/3
  • @tobias_k 我目前是这样做的——城市列表、州缩写、州全称、县、国家。我遇到的问题是某些位置拼写错误,或者不在我的列表中,或者缩写(mpls、stl 等),或者以“fort”或“ft”开头,或者是“{word} village”,或者像“希望”、“在”(对于印第安纳州)等太笼统了。我希望一个通用的正则表达式逻辑适用于每一行,但根据迄今为止的响应,它听起来并不存在。感谢您的意见。
  • 嗯,这取决于问题。当然没有正则表达式可以匹配,例如所有美国、日本和非洲城市名称,但对于那些“黄页美国城市名称”,它可能有效。也许有一个适合您的正文的正则表达式,但是这样说您的示例太小了。顺便说一句,似乎位置总是最后一个;你试过只取每行的最后几个词吗?

标签: python regex python-3.x


【解决方案1】:

正则表达式无法实现您所追求的。正则表达式需要字符串模式才能工作。在您的情况下,该模式似乎不存在或可以采用多种形式。

您可以做的是使用搜索高效的数据结构并将字符串拆分为单词。然后,您将检查每个单词,看看它是否在您的搜索高效数据结构中。

【讨论】:

  • 如果我的模式是整个短语在单词 '\sin\s' 之后但在州缩写或全名 state (wa|ny|tx|washington|texas) 之前怎么办?请问那个正则表达式是什么?我试图弄清楚这一点,但到目前为止没有成功。
  • @Jarad:这将与\sin\s(.+?)(wa|ny|tx|washington|texas) 类似,但是,最后一点会随着您投入的状态越多而增长很多,从而使其难以阅读和维护。此外,在性能方面,最好简单地使用我在回答中建议的方法。
【解决方案2】:
import re

l = ['replacement windows in seattle wa',
     'basement remodeling houston texas',
     'siding contractor newyork ny',
     'windows in elk grove village']

p = re.compile(r"(\w+)\s(?:(wa | texas | ny | village))", re.VERBOSE)

for words in l:
    print p.search(words).expand(r"\g<1> <-- the code is --> \g<2>")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多