使用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
至("Germany", "République fédérale d'Allemagne")
s2
至("English", "anglais")
s3
至("February", "février")
如果\t
的每一侧只有一对vocable或多个表达式。
事情是我找不到合适的模式。我尝试了多个表达式(使用search()
,然后在返回的匹配对象上调用groups()
),这似乎无法解决问题。
s1的例子:
r"([\w ]*)\t([\w ]*)"
找到(' Federal Republic of Germany', 'République fédérale d')
r"(.*),?\t(.*),?"
找到('Germany ; Federal Republic of Germany', "République fédérale
d'Allemagne")
这两个例子并不能完全符合我的要求。我不知道下一步该尝试什么。我确信有一种方法可以匹配" ; "
跟随任何字符,直到\t
,但我现在不知道如何。
非常感谢帮助。
答案 0 :(得分:1)
你可以这样做:
res = s.strip().split('\t')
res[0] = res[0].split(';')[0].strip()
使用正则表达式:
import re
pat = re.compile(r'^\s*([^\s\t;]+(?:[^\S\t]+[^\s;]+)*)[^\S\t]*(?:;[^\t]*)?\t\s*(.*\S)')
m = pat.match(s)
[m.group(1), m.group(2)]
答案 1 :(得分:1)
要记住的重要一点是中间部分 - 可选的第二位由';' - 是可选的。正则表达式使用?
运算符支持可选部分。
你想捕捉第一个单词,忽略中间部分,并捕获最后一部分:
(capture) optional? (capture)
因为中间部分可能很复杂,所以你需要使用parens。但你可以使用非捕获的parens - (?: 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)))
答案 2 :(得分:0)
试试这个正则表达式:([^;\t]+)[;]*[^\t]*([^\n]*)
结果将包含空格填充,您可能希望删除它。
([^;\t]+)
捕获不是\t
或;
[;]*
0或更多;
[^\t]*
0个或更多不是\t
个字符([^\n]*)
捕获0个或更多不是\n
个字符答案 3 :(得分:0)
答案 4 :(得分:0)
容易!
^(\S+)[^\t]*\t\s*(.+)\s*$
^(\S+)
:获取字符串最开头的所有非空白字符。[^\t]*\t
:忽略所有内容,直到第一个标签字符(\t
)。\s*(.+)\s*$
:获取字符串末尾的剩余部分,左边和右边有空格。