我有以下文件名样本:
./ 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字符后面提取数字?
答案 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
。