在搜索时我发现了threat。这很安静,接近我的需要。
直接导致我的第一个问题:
我的字符串是:
line = <draw:line draw:style-name="gr1" draw:text-style-name="P1" draw:layer="layout" svg:x1="0cm" svg:y1="0cm" svg:x2="3.5cm" svg:y2="2.7cm">
我需要在svg:x1 =标签之后提取值。所以我试过
print re.findall(r"(?<=svg:x1) (.*?) (?=svg:y1)", line)
但是除了[]之外什么都没有打印。
第二个问题是我尝试了类似
的东西line = 'string1 string2 string3'
然后
print re.findall(r"(?<=string1) (.*?) (?=string3)", line)
给出我想要的东西,但是当我尝试
时file.write(re.findall(r"(?<=string1) (.*?) (?=string3)", line))
(我想写的文件当然是之前定义的,所以我可以写东西)
我得到“TypeError:期望一个字符缓冲区对象”
所以现在我的问题在一个完整的句子:) 如何在特定字符串之间提取字符串并将其保存在文件中?
答案 0 :(得分:2)
以下正则表达式
print re.findall(r"(?<=svg:x1) (.*?) (?=svg:y1)", line)
你写的在svg:x1之后需要一个空格,而原始字符串中不是这种情况。正确的正则表达式是
print re.findall(r"(?<=svg:x1)(.*?)(?= svg:y1)", line)
您编写的正则表达式返回一个列表。您必须迭代列表才能将项目写入文件。
data=re.findall(r"(?<=svg:x1)(.*?)(?= svg:y1)", line)
fl.write(' '.join(data))
不要将file
用作变量。它是Python中的保留字。
答案 1 :(得分:0)
你可以在没有正则表达式的情况下做到这一点。
def get_middle_text(line, string_start, string_end):
temp = line.split(string_start)[1]
return temp.split(string_end)[0]
result = get_middle_text(line, 'string1', 'string2')
编辑:
如果您可以进行多项匹配,则可以执行以下操作,并返回匹配字段:
def get_middle_text(line, string_start, string_end):
tmp = line.split(string_start)
result = []
if len(tmp) == 1:
return result
for x in range(1, len(tmp)):
temp = tmp[x].split(string_end)[0]
result.append(temp)
return result
答案 2 :(得分:0)
这是你想要的吗?
In [10]: re.findall('svg:x1="([^"]*)"', line)
Out[10]: ['0cm']
编辑:
re.findall('svg:x1="(\d*)cm"', line)
In [11]: re.findall('svg:x1="(\d*)cm"', line)
Out[11]: ['0']