假设我有一个包含数据/字符串的文本文件:
Dataset #1: X/Y= 5, Z=7 has been calculated
Dataset #2: X/Y= 6, Z=8 has been calculated
Dataset #10: X/Y =7, Z=9 has been calculated
我希望输出在csv文件中:
X/Y, X/Y, X/Y
应该显示:
5, 6, 7
这是我目前使用的方法,我使用的是string.find,但我觉得解决这个问题相当困难:
data = open('TestData.txt').read()
#index of string
counter = 1
if (data.find('X/Y=')==1):
#extracts segment out of string
line = data[r+6:r+14]
r = data.find('X/Y=')
counter += 1
print line
else:
r = data.find('X/Y')`enter code here`
line = data[r+6:r+14]
for x in range(0,counter):
print line
print counter
错误:出于某种原因,我只得到5的值。当我设置#loop时,我得到无限的5。
答案 0 :(得分:2)
如果您希望数字和txt文件的格式类似于前两行,即X/Y= 6
,则不像X/Y =7
:
import re
result=[]
with open("TestData.txt") as f:
for line in f:
s = re.search(r'(?<=Y=\s)\d+',line) # pattern matches up to "Y" followed by "=" and a space "\s" then a digit or digits.
if s: # if there is a match i.e re.search does not return None, add match to the list.
result.append(s.group())
print result
['5', '6', '7']
要匹配评论中的模式,您应该像时间一样逃避。或者你将匹配1.2 + 3之类的字符串......“。”有特殊的意义。
所以re.search(r'(?<=Counting Numbers =\s)\d\.\d\.\d',s).group()
将仅返回1.2.3
如果它更明确,您可以使用完整的s=re.search(r'(?<=X/Y=\s)\d+',line)
模式X/Y=\s
。
使用评论和更新行中的原始行将返回:
['5', '6', '7', '5', '5']
(?<=Y=\s
)被称为正面后瞻断言。
(?<=...)
匹配,如果字符串中的当前位置前面有匹配的...,结束于当前位置
有很多很好的例子here in the re documentation。 parens中的项目不会被退回。
答案 1 :(得分:1)
由于实体似乎都在一行中,我建议您使用readline
中的loop
逐行读取文件,然后使用regex
从该行解析出你正在寻找的组件。
编辑重新:OP的评论:
在这种情况下,可用于捕获给定指定格式的数字的一个正则表达式模式为:X/Y\s*=\s*(.+),