【问题标题】:Multilanguage string regex多语言字符串正则表达式
【发布时间】:2016-11-27 17:40:07
【问题描述】:

我的字符串包含来自不同语言的字符,例如:

en <chars in english> fr <chars in french> es <chars in spanish>

我只需要从上面的字符串中提取特定语言的子字符串。我如何使用 regex 或 python2.6 中的其他工具来做到这一点?

ps。它可能是不同的顺序,例如:en (.) es (.) it (.*),问题是 es 或 fr 或 it - 不是拉丁字符集, - 这就是为什么常规正则表达式无法正常使用它

【问题讨论】:

  • 如何在正则表达式中定义in specific language
  • 你有像[english word(s)] - [spanish word(s)] - ...这样的可靠结构还是你必须猜测语言?这将是一项艰巨的任务。
  • 你能发布一个预期结果的例子吗?这不是很清楚......
  • 结构如上,新语言字符开始于:english français español
  • 这种正则表达式怎么样:r"english (.*) français (.*) español (.*)"

标签: python regex


【解决方案1】:

Regex 可与 unicode 配合使用,您可以使用多种选项来分割字符串。这是一个示例,其中字符串在“en”和“es”等语言代码边界上拆分并放入列表中。然后是迭代列表并找到您想要的语言的问题。

>>> text = u"en <chars in english> fr <chars in french> es <chars in spanish>"
>>> languages = set((u'en', u'fr', u'es'))
>>> re_languages = '|'.join(languages)
>>> splitter = re.compile(ur'\b({})\b'.format(re_languages))
>>> splitter.split(text)
[u'', u'en', u' <chars in english> ', u'fr', u' <chars in french> ', u'es', u' <chars in spanish>']

>>> parts=splitter.split(text)[1:]
>>> for i in range(0, len(parts),2):
...     if parts[i] == 'es':
...         print parts[i+1]
... 
 <chars in spanish>
>>> 

或者你可以一次找到一个

>>> re.findall(r'\b(en|es|fr) (.*?)(?:(?= (?:en|es|fr)\b)|$)', text)
[(u'en', u'<chars in english>'), (u'fr', u'<chars in french>'), (u'es', u'<chars in spanish>')]
>>> 

【讨论】:

  • 您是否考虑到语言代码边界enfres - 使用不同的字符集?例如,如果我尝试将其查找为 r'en (.*) fr' - 它什么也没找到,因为 fr - 在不同的字符集中。
  • 嗯,什么?如果您使用的是 unicode,它们不在不同的字符集中。如果您以某种方式使用多个字符集(可能是多个 Windows 代码页?)它们无论如何都不能在同一个字符串中。而且您必须将它们解码为 un​​icode 才能使其正常工作。测试 re.search(r'en (.*) fr', u"en &lt;chars in english&gt; fr &lt;chars in french&gt; es &lt;chars in spanish&gt;") 对我来说很好。
猜你喜欢
  • 2023-03-22
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2015-01-11
  • 2020-05-05
相关资源
最近更新 更多