python - 高级字符串的正则表达式

标签 python regex match

使用 Python 3.4 我想匹配具有以下格式的字符串:

s1 = "Germany  ; Federal Republic of Germany\tRépublique fédérale d'Allemagne\n"
s2 = "English  ; English language\tanglais\n"
s3 = "February\tfévrier\n"

请注意两种语言之间如何存在制表符,如果一种语言中有多个单词,则它们被 "; "(两个空格、分号、一个空格)分隔。

我的目标是读取每种语言的第一个变量。所以我想匹配

  • s1("德国", "République fédérale d'Allemagne")
  • s2("English", "anglais")
  • s3("二月", "février")

\t两边只有一对词汇或多个表达式的情况下。

问题是我找不到正确的模式。我尝试了多个表达式(使用 search() ,然后在返回的匹配对象上调用 groups() ),但似乎无法解决问题。

s1 的示例:

  • r"([\w ]*)\t([\w ]*)" 查找 ('德意志联邦共和国', 'République fédérale d')
  • r"(.*),?\t(.*),?" 查找 ('德国 ; 德意志联邦共和国', "République fédérale 达勒曼”)

这两个例子都没有达到我想要的效果。我不知道下一步该尝试什么。我确信有一种方法可以匹配 "; " 后面的任何字符,直到 \t 但我现在不知道如何。

非常感谢您的帮助。

最佳答案

需要记住的重要一点是中间部分 - 由“;”分隔的可选第二位- 是可选的。正则表达式支持使用 ? 运算符的可选部分。

您想要捕获第一个单词,忽略中间部分,并捕获最后部分:

(capture) optional? (capture)

因为中间部分可能很复杂,所以您需要使用括号。但是您可以使用非捕获括号 - (?: non-captured pattern ) 来实现这一点。

(capture) (?: optional )? (capture)

你也许可以弄清楚剩下的事情:

#! python3
strings = [
    "Germany  ; Federal Republic of Germany\tRépublique fédérale d'Allemagne\n",
    "English  ; English language\tanglais\n",
    "February\tfévrier\n",
]

import re

for s in strings:
    m = re.match(r"^(\S+)(?:  ; [^\t]+)?\t([^\n]+)\n", s)
    print((m.group(1), m.group(2)))

关于python - 高级字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36635381/

相关文章:

python - 无法使用 "#!/usr/bin/env python"将参数传递给 python

python - 在 Linux 上调用 cx_Oracle 之前设置正确的环境变量

opencv - 特征检测的可靠性

python - 从打印输出中删除空格 - Python 3

python - 如何从列表类别中对 pandas 数据框进行排序?

c++ - PCRE 库是线程安全的吗?如果没有,你推荐哪个?

mysql - 在 MySQL 中使用 REGEXP 在逗号分隔列表中查找特定数字

android - 正则表达式如何从json中提取数据

c# - 当 regex101 匹配时,RegEx C# 不匹配

php - 使用 MATCH AGAINST 选择单个找到的结果