【问题标题】:Python Regex for greek words希腊词的 Python 正则表达式
【发布时间】:2013-11-26 16:38:29
【问题描述】:

我想制作一个 python 脚本,它使用正则表达式从我提供的源文本中过滤出包含某些希腊单词的行,然后根据遇到的单词将这些行写入 3 个不同的文件。

到目前为止,这是我的代码:

import regex

source=open('source.txt', 'r')
oti=open('results_oti.txt', 'w')
tis=open('results_tis.txt', 'w')
ton=open('results_ton.txt', 'w')

regex_oti='^.*\b(ότι|ό,τι)\b.*$'
regex_tis='^.*\b(της|τις)\b.*$'
regex_ton='^.*\b(τον|των)\b.*$'

for line in source.readlines():
    if regex.match(regex_oti, line):
        oti.write(line)
    if regex.match(regex_tis, line):
        tis.write(line)
    if regex.match(regex_ton, line):
        ton.write(line)
source.close()
oti.close()
tis.close()
ton.close()
quit()

我检查的词是ότι | ό,τι | της | τις | τον | των

问题是这 3 个正则表达式(regex_otiregex_tisregex_ton)不匹配任何内容,因此我创建的 3 个文本文件不包含任何内容。

可能是编码问题(Unicode)?

【问题讨论】:

  • 这是 Python 2 还是 3?
  • Python 2.7.3 实际上:)
  • 您必须在正则表达式中使用原始 unicode 字符串以及 re.U 标志才能使其工作。
  • @alko:re.U 标志在为正则表达式使用 unicode 字符串值时是隐含的。
  • 面面相觑的回答 - 使用 Python 3.x 来避免 unicode 问题。

标签: python regex unicode python-unicode


【解决方案1】:

您正在尝试将编码值(作为字节)与一个 很可能 不匹配的正则表达式匹配,除非您的 Python 源编码与输入文件的编码完全匹配,然后只有当您未使用多字节编码,例如 UTF-8。

您需要将输入文件解码为 Unicode 值,并使用 Unicode 正则表达式。这意味着您需要知道用于输入文件的编解码器。使用io.open()处理解码和编码是最简单的:

import io
import re

regex_oti = re.compile(ur'^.*\b(ότι|ό,τι)\b.*$')
regex_tis = re.compile(ur'^.*\b(της|τις)\b.*$')
regex_ton = re.compile(ur'^.*\b(τον|των)\b.*$')

with io.open('source.txt', 'r', encoding='utf8') as source, \
     io.open('results_oti.txt', 'w', encoding='utf8') as oti, \
     io.open('results_tis.txt', 'w', encoding='utf8') as tis, \
     io.open('results_ton.txt', 'w', encoding='utf8') as ton:

    for line in source:
        if regex_oti.match(line):
            oti.write(line)
        if regex_tis.match(line):
            tis.write(line)
        if regex_ton.match(line):
            ton.write(line)

注意ur'...' 原始unicode 字符串来定义正则表达式模式;现在这些是 Unicode 模式并且匹配 codepoints,而不是字节。

io.open() 调用确保您读取unicode,并且当您将unicode 值写入输出文件时,数据会自动编码为 UTF-8。我也为输入文件选择了 UTF-8,但您需要检查该文件的正确编解码器并坚持使用。

我在这里使用了with 语句来自动关闭文件,使用source 作为可迭代对象(无需一次性将所有行读入内存),并预编译了正则表达式。

【讨论】:

  • 我认为这行不通...它给我一个错误,上面写着:UnicodeDecodeError:'utf-8' codec can't decode byte 0xca in position 4: invalid continuation byte my source file has通常有很多符号和东西......这是它的第一行: CON[Καικαι>] VP[έχουν περάσει ] NP[*πολλοίπολύς>] CON[καικαι>] NP[*« χαρισματικοίχαρισματικός> *» *. ] # 不要费心去检查它是为机器学习的特定用途而设计的......
  • 那么你的输入不是UTF8。为文件选择正确的编解码器。
  • 我怎么知道哪个编解码器是正确的?抱歉麻烦...我对这一切都很陌生:) 还有别的,源文件和输出文件(em 的 3 个)的编码是否必须相同?
  • 不,输出编码可以不同。有时,制定 input 编解码器需要反复试验。查看文件时您使用的是什么编解码器?
  • "ANSI" 是Windows codepage 1252;在 Python 中使用 'cp1252'。或者,至少,这就是它通常的意思。在控制台中,运行chcp,它将打印当前代码页。如果它显示1253(希腊代码页),那么显然使用cp1253
猜你喜欢
  • 2020-10-16
  • 2011-01-30
  • 1970-01-01
  • 2016-12-28
  • 2022-01-10
  • 2011-08-20
  • 2018-05-28
  • 2018-04-09
  • 2013-01-14
相关资源
最近更新 更多