【问题标题】:Regular Expression: return everything in a line prior to the second tab occurence正则表达式:在第二个制表符出现之前返回一行中的所有内容
【发布时间】:2020-01-28 15:56:59
【问题描述】:

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

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)

基本上用 \t 分成三个字段。例如:

\t bonjour \t CC-BY 2.0(法国)署名:tatoeba.org #538123 (CM) & #629296 (Samer)

我试图只获取 key:value:

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

感谢您的帮助!

【问题讨论】:

  • 您可以使用捕获组使用正则表达式模式来完成它,但是您为什么不直接修改当前代码,所以在pairs = [line.split('\t') for line in lines] 之后只需返回一个带有 paris[0] 和pairs[1 的新数组]?

标签: regex python-3.x file parsing


【解决方案1】:

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

^([^\t]+)\t([^\t]+)
  • ^ 字符串开头(可以使用re.match 省略)
  • ([^\t]+) 捕获 group 1 匹配除 tab 之外的任何字符
  • \t 匹配标签
  • ([^\t]+) 捕获 group 2 匹配除 tab 之外的任何字符

Regex demo | Python demo

如果您不想换行,可以将其添加到字符类[^\t\r\n]

例如:

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!')]

【讨论】:

    【解决方案2】:

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

    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!')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 2014-10-19
      • 2016-11-08
      • 2017-11-15
      • 2011-08-24
      相关资源
      最近更新 更多