使用Python中的REGEX从文本文件

时间:2016-08-23 14:14:21

标签: python regex

我正在尝试读取一个包含变量名称和相应值的大文本文件(参见下面的小例子)。名称都是大写的,值通常用句点和空格分隔,但如果变量名太长,则只用空格分隔。

WATER DEPTH ..........     20.00 M      TENSION AT TOUCHDOWN .    382.47 KN  

TOUCHDOWN X-COORD. ...   -206.75 M      BOTTOM SLOPE ANGLE ...     0.000 DEG 

PROJECTED SPAN LENGTH     166.74 M      PIPE LENGTH GAIN .....      1.72 M  

我可以使用以下表达式找到值:

line = '   PROJECTED SPAN LENGTH     166.74 M      PIPE LENGTH GAIN .....      1.72 M   \n'
re.findall(r"[-+]?\d*\.\d+|\d+", line):
['166.74', '1.72']

但是当我尝试提取变量名时,使用下面的表达式我有前导和尾随的空格,我想省略。

re.findall('(?<=\s.)[A-Z\s]+', line)
[' PROJECTED SPAN LENGTH     ', '      PIPE LENGTH GAIN ', '    ', '   \n']

我相信它应该有类似^ \ s的东西,但我无法让它发挥作用。 成功后,我想将数据存储在数据框中,将变量名称作为索引,将值作为列。

3 个答案:

答案 0 :(得分:0)

使用[A-Z]{2,}(?:\s+[A-Z]+)*

[A-Z]{2,}查找长度至少为2的大写单词

(?:\s+[A-Z]+)*是一个捕获组,如果标签中有多个单词

修改

要在评论中处理此案例,我建议:

[A-Z-\/]{2,}(?:\s*[A-Z-\/]+(?:\.)*)*

确保在R.O.W.之前和...之前的最后一段时间后至少有一个空格

[A-Z-\/]{2,}将检查大写字母, - 和/或2长度或更长

(?:\s*[A-Z-\/]+(?:\.)*)*是一个捕获组,用于包含多个单词和/或带有句点的单词

答案 1 :(得分:0)

如果您想要取出前导/尾随空格,可以使用.strip()方法。

Python String strip

stripped_values = [raw.strip() for raw in re.findall('(?<=\s.)[A-Z\s]+', line)]

答案 2 :(得分:0)

您可以将以下表达式与re.finditer()一起使用:

(?P<category>[A-Z][A-Z- ]+[A-Z])
[. ]+
(?P<value>-?\d[.\d]+)\ 
(?P<unit>M|DEG|KN)

a demo on regex101.com

<小时/> 在Python中,这将是:

import re

rx = re.compile(r'''
    (?P<category>[A-Z][A-Z- ]+[A-Z])
    [. ]+
    (?P<value>-?\d[.\d]+)\ 
    (?P<unit>M|DEG|KN)
''', re.VERBOSE)

string = '''
WATER DEPTH ..........     20.00 M      TENSION AT TOUCHDOWN .    382.47 KN  

TOUCHDOWN X-COORD. ...   -206.75 M      BOTTOM SLOPE ANGLE ...     0.000 DEG 

PROJECTED SPAN LENGTH     166.74 M      PIPE LENGTH GAIN .....      1.72 M  
'''

matches = [(m.group('category'), m.group('value'), m.group('unit')) \
            for m in rx.finditer(string)]
print(matches)
# [('WATER DEPTH', '20.00', 'M'), ('TENSION AT TOUCHDOWN', '382.47', 'KN'), ('TOUCHDOWN X-COORD', '-206.75', 'M'), ('BOTTOM SLOPE ANGLE', '0.000', 'DEG'), ('PROJECTED SPAN LENGTH', '166.74', 'M'), ('PIPE LENGTH GAIN', '1.72', 'M')]

请参阅a demo on ideone.com