2013-03-07 53 views
0

搜索时发现此threat。这很安静,接近我所需要的。Python - 如何查找并保存两个特定字符串之间的所有单词

至极直接导致了我的第一个问题:

我的字符串是:

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)) 

(文件I想写的东西当然是之前定义的,所以我可以写东西给它)

我得到“类型错误:预期的字符缓冲区对象”

所以现在我在一个完整的句子:) 问题,我怎么能提取字符串之间的特定字符串,并将其保存在一个文件?

+0

的http://计算器。com/questions/2717856/any-good-and-gentle-python-regexp-tutorials-out-there – 2013-03-07 11:15:50

回答

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'] 
+0

我想要没有“cm”的那个。但是,这似乎非常好。请你试着解释为什么在输出中排除“”,我在阅读文档时试图理解,但由于英文不是我的母语,这对我来说似乎有点困难。 – user2143528 2013-03-07 12:10:00

+0

“都在inter()之外。 – waitingkuo 2013-03-07 12:20:12

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 
+0

这样做的问题是,由于必须提取多个值,因此必须多次调用此函数,这是低效的。 @ jitendra的正则表达式解决方案更好。 – 2013-03-07 11:21:44

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

用'fl.write(''.join(match))'替换'for'循环可能更高效。 – 2013-03-07 11:19:09

+1

@KyleStrand你是对的。我编辑了解决方案并实施了您的建议。 – jitendra 2013-03-07 11:22:08

+0

看起来不错,但我怎样才能删除“”和厘米,以便我只收回整数? – user2143528 2013-03-07 12:15:43

相关问题