Python 2.7中带有变量的Regex搜索返回字节,而不是解码文本



"wordslist"的单词和我正在搜索的文本都是西里尔字母。文本以UTF-8编码(如Notepad++中设置的)。我需要Python来匹配文本中的一个单词,并获取单词后面的所有内容,直到句号后跟新行。

编辑

with open('C:....txt', 'rb') as f:
wordslist = []
for line in f:
wordslist.append(line) 
wordslist = map(str.strip, wordslist)

/编辑

for i in wordslist:
print i #so far, so good, I get Cyrillic
wantedtext = re.findall(i+".*.rn", open('C:....txt', 'rb').read())
wantedtext = str(wantedtext)
print wantedtext

"Wantedtext"显示并保存为"\xd0\xb2"(等)。

我尝试了什么:

这个问题不同,因为没有变量:将字节转换为python字符串。此外,所选答案的解决方案

wantedtext.decode('utf-8')

没有起作用,结果是一样的。这里的解决方案也无济于事。

编辑:修订代码,返回"[]"。

with io.open('C:....txt', 'r', encoding='utf-8') as f:
wordslist = f.read().splitlines() 
for i in wordslist:
print i
with io.open('C:....txt', 'r', encoding='utf-8') as my_file:
my_file_test = my_file.read()
print my_file_test #works, prints cyrillic characters, but...

wantedtext = re.findall(i+".*.rn", my_file_test)
wantedtext = str(wantedtext)
print wantedtext #returns []

(在下面的注释后添加:如果您从正则表达式中删除\r,则此代码有效。)

仅Python 2.x

您的find可能不起作用,因为您混合了str和Unicodes str,或者str包含不同的编码。如果您不知道Unicode str和str之间的区别,请参阅:https://stackoverflow.com/a/35444608/1554386

除非你知道自己在做什么,否则不要启动decoding。这不是巫毒:)

您需要先将所有文本转换为Unicode对象。

  1. 将您的阅读分成单独的一行-阅读起来更容易
  2. 解码您的文本文件。使用支持Python 3解码的io.open()。我假设你的文本文件是UTF-8(如果不是,我们很快就会发现):

    with io.open('C:....txt', 'r', encoding='utf-8') as my_file:
    my_file_test = my_file.read()
    

    my_file_test现在是一个Unicode str

  3. 现在你可以做:

    # finds lines beginning with i, ending in .
    regex = u'^{i}*?.$'.format(i=i)
    wantedtext = re.findall(regex, my_file_test, re.M)
    
  4. 看看wordslist。你没有说你对它做了什么,但你需要确保它也是一个Unicode str。如果从文件中读取,请使用与上面相同的io.open

编辑:

对于wordslist,您可以解码文件并将其读取到列表中,同时一次性删除换行符:

with io.open('C:....txt', 'r', encoding='utf-8') as f:
wordslist = f.read().splitlines() 

最新更新