我正在尝试读取一个包含变量名称和相应值的大文本文件(参见下面的小例子)。名称都是大写的,值通常用句点和空格分隔,但如果变量名太长,则只用空格分隔。
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的东西,但我无法让它发挥作用。 成功后,我想将数据存储在数据框中,将变量名称作为索引,将值作为列。
答案 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()
方法。
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)
<小时/>
在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')]