高级字符串的正则表达式

时间:2016-04-14 22:52:20

标签: 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("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,但我现在不知道如何。

非常感谢帮助。

5 个答案:

答案 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)

使用此正则表达式:

(\w*).*\t(.*)

第一个捕获组将包含该语言的单字名称,第二个捕获组将包含该消息。

Regex101 Tested

答案 4 :(得分:0)

容易!

^(\S+)[^\t]*\t\s*(.+)\s*$

说明:

  • ^(\S+):获取字符串最开头的所有非空白字符。
  • [^\t]*\t:忽略所有内容,直到第一个标签字符(\t)。
  • \s*(.+)\s*$:获取字符串末尾的剩余部分,左边和右边有空格。