如何使用Python中的正则表达式在unicode字符后面提取数字?

时间:2016-06-20 09:12:48

标签: python regex unicode

我有以下文件名样本:

./ data / DDT - T = 10 K / DDT - T = 10 K - φ= 1.0 / DDT - T = 10 K - φ= 1.0 - DCT 0 / DDT - 结果 - T = 10 K - φ= 1.0 - DCT 10-40 - t = 1000 s.dat

我正在尝试使用Python中的正则表达式提取φ的值,代码为:

import numpy as np
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')

file_names = []
file_name_1 = str(u'./data/DDT - T = 10 K/DDT - T = 10 K - \u03C6 = 1.0/DDT - T = 10 K - \u03C6 = 1.0 - DCT 0/DDT - Result - T = 10 K - \u03C6 = 1.0 - DCT 10-40 - t = 1000 s.dat')
file_name_2 = str(u'./data/DDT - T = 10 K/DDT - T = 10 K - \u03C6 = 1.0/DDT - T = 10 K - \u03C6 = 1.0 - DCT 0/DDT - Result - T = 10 K - \u03C6 = 1.0 - DCT 10-40 - t = 2000 s.dat')
file_name_3 = str(u'./data/DDT - T = 10 K/DDT - T = 10 K - \u03C6 = 1.0/DDT - T = 10 K - \u03C6 = 1.0 - DCT 0/DDT - Result - T = 10 K - \u03C6 = 1.0 - DCT 10-40 - t = 3000 s.dat')
file_names.append(file_name_1)
file_names.append(file_name_2)
file_names.append(file_name_3)

file_names = np.asarray(file_names)
for file_name in file_names:
    phi = re.findall(ur"(?:\u03C6 = )([-+]?\d*\.\d+|\d+)", file_name)
    print phi

但它无法提取所需的值。如何使用Python中的正则表达式在unicode字符后面提取数字?

2 个答案:

答案 0 :(得分:1)

我认为你只是混淆了字节字符串和Unicode字符串。你需要确保在处理文本时处理一种类型的字符串,你不能混淆它们。因此,如果您需要保留字节字符串,请不要使用字符串中的u''前缀,并保留str('...')

file_name_1 = str('./data/DDT - T = 10 K/DDT - T = 10 K - \u03C6 = 1.0/DDT - T = 10 K - \u03C6 = 1.0 - DCT 0/DDT - Result - T = 10 K - \u03C6 = 1.0 - DCT 10-40 - t = 1000 s.dat')
              ^^^ ^
...
phi = re.findall(r"(?:\u03C6 = )([-+]?\d*\.\d+|\d+)", file_name)
                 ^

您将获得['1.0', '1.0', '1.0']的输出。请参阅IDEONE demo

否则,您需要删除str()并保留u''前缀才能使用Unicode字符串。不要忘记将u前缀保留为正则表达式模式,然后。

答案 1 :(得分:1)

只需使用Unicode字符串。这是一个有效的简化版本。如果将源保存为UTF-8并声明源编码,则也可以使用实际的φ字符,但使用Unicode转义也可以。

#encoding:utf8
import re

file_names = [u'./data/DDT - T = 10 K/DDT - T = 10 K - φ = 1.0/DDT - T = 10 K - φ = 1.0 - DCT 0/DDT - Result - T = 10 K - φ = 1.0 - DCT 10-40 - t = 1000 s.dat',
              u'./data/DDT - T = 10 K/DDT - T = 10 K - φ = 1.0/DDT - T = 10 K - φ = 1.0 - DCT 0/DDT - Result - T = 10 K - φ = 1.0 - DCT 10-40 - t = 2000 s.dat',
              u'./data/DDT - T = 10 K/DDT - T = 10 K - φ = 1.0/DDT - T = 10 K - φ = 1.0 - DCT 0/DDT - Result - T = 10 K - φ = 1.0 - DCT 10-40 - t = 3000 s.dat']
for file_name in file_names:
    phi = re.findall(ur'(?:φ = )([-+]?\d*\.\d+|\d+)', file_name)
    print phi

输出:

[u'1.0', u'1.0', u'1.0']
[u'1.0', u'1.0', u'1.0']
[u'1.0', u'1.0', u'1.0']

注意:永远不要使用reload(sys)技巧,无论如何都无用。 Python 2.X库期望默认编码为ascii。改变它可能会导致错误。没理由也使用numpy