【问题标题】:Regex to match variations of words正则表达式匹配单词的变体
【发布时间】:2017-07-06 22:02:26
【问题描述】:

我有几个格式的句子:

卡塔尔公民的签证要求是其他国家当局对卡塔尔公民施加的行政入境限制。

英国公民的签证要求是其他国家当局对英国公民施加的行政入境限制。

对白俄罗斯公民的签证要求是其他国家当局对白俄罗斯公民施加的行政入境限制。

我只想匹配上面句子中的“[国家名称]的公民”。如您所见,其中一些以“中国公民”结尾。其他人继续,有些人有像“the”这样的词,有些国家有两个或多个像“英国”这样的词。

如何编写一个 (pythonic) 正则表达式来匹配上述所有语句及其变体中的“COUNTRY_NAME 的公民”?

【问题讨论】:

  • 这对于正则表达式来说肯定不是一件容易的事。
  • 我对@9​​87654324@ 不太熟悉,而且在我看来,由于国家/地区可以包含多个单词,而且它们可能不会全部使用大写字母,因此对于您构建一个包含所有国家/地区英文名称的列表,然后进行过滤。
  • 国名总是大小写正确吗? (首字母大写)
  • 首先,请说明您的问题。你能描述所有可能的短语吗?你能描述短语分隔符吗?例如,您如何区分“巴西合众国”和“北美合众国”?您如何区分“特立尼达和多巴哥”与“法国和德国”? - - - - 除非你能指定语言问题的边界,否则要求一个具体的解决方案是行不通的。相反,也许您需要的是所有国家的综合清单;那么你可以从“citizens of”中找到它。
  • 由于没有可变国家/地区,请安装regexformat.com app。将三元字符串中所有可能的国家/地区名称转储到正则表达式工具。它创建了一个完整的、多级的正则表达式树,您可以使用它。只需将citizens of 放在它前面。 Screenshot 的工具。这是使用该工具创建的175,000 word dictionary 示例。

标签: python regex string


【解决方案1】:

使用regex 模块,以便我们可以使用Unicode categories

我们假设国家名称是多个连续的单词,每个单词都以大写字母开头,并由一定数量的空格分隔。如果你不能做出这样的假设,那就随意调整它。如果您已经有一个国家/地区列表,那么只需 .{,40} 匹配国家/地区部分(或其他一些合理的限制)并检查某个国家/地区是否是子字符串。

import regex as re

text = '''Visa requirements...'''
country_pat = r'citizens of (?:the )?((?:\p{Lu}\p{L}+(?:\s*))+)'
print(country_pat.findall(text))

(?: 表示我们不匹配该部分,p{Lu}p{L} 分别是 Unicode 大写字母和字母。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多