正则表达式:返回第二个制表符出现之前一行中的所有内容



我有一个包含以下格式数据的语料库文件:

Hi.   bonjour.  CC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #629296 (Samer)
black!  noir!   CC-BY 2.0 (France) Attribution: tatoeba.org #906328 (papabear) & #1245450 (saeb)

基本上分为三个字段

,例如:Hi\tbonjour\tCC-BY 2.0 (法国( 署名: tatoeba.org #538123 (CM( & #629296 (Samer(

我试图只获取键:值:

Hi.   bonjour.
black!  noir!

并避免接下来的所有其他事情。 这就是我在 key:value 之后添加额外元数据之前的做法:

def load_doc(filename):
with codecs.open(filename, "r+", "utf-8") as file:
file = file.read()
return file

def to_pairs(doc):
lines = doc.strip().split('n')
pairs = [line.split('t') for line in  lines]
return pairs
pairs = to_pairs(load_doc(filename))

谢谢你的帮助!

您可以使用 2 个否定字符类和 2 个捕获组。

^([^t]+)t([^t]+)
  • ^字符串的开头(可以使用 re.match 省略(
  • ([^t]+)捕获组 1匹配除制表符以外的任何字符
  • t匹配选项卡
  • ([^t]+)捕获组 2匹配除制表符以外的任何字符

正则表达式演示 |蟒蛇演示

如果您不想越过换行符,可以将其添加到字符类[^trn]

例如:

import re
doc = ("Hi. bonjour.    CC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #629296 (Samer)n"
"black! noir!   CC-BY 2.0 (France) Attribution: tatoeba.org #906328 (papabear) & #1245450 (saeb)")
lines = doc.strip().split('n')
pairs = [re.match(r"([^t]+)t([^t]+)", line).groups() for line in lines]
print (pairs)

输出

[('Hi.', 'bonjour.'), ('black!', 'noir!')]

这是一种完成这项工作的方法:

import re
lines = [
'Hi.tbonjour.tCC-BY 2.0 (France) Attribution: tatoeba.org #538123 (CM) & #629296 (Samer)',
'black!tnoir!tCC-BY 2.0 (France) Attribution: tatoeba.org #906328 (papabear) & #1245450 (saeb)',
]
for line in lines:
pairs = re.search(r'^(.+?)t(.+?)(?=t)', line)
print(pairs.groups())
#added parentheses to built-in method 'print' OP Python v3+

输出:

('Hi.', 'bonjour.')
('black!', 'noir!')

相关内容

最新更新