使用 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/