0

在搜索时我发现了这个威胁。这很安静,接近我的需要。

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

我的字符串是:

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:期望一个字符缓冲区对象”

所以现在我的问题是一个完整的句子:
如何提取特定字符串之间的字符串并将其保存在文件中?

4

3 回答 3

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 中的保留字。

于 2013-03-07T11:16:59.387 回答
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
于 2013-03-07T11:15:29.447 回答
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']
于 2013-03-07T11:22:33.187 回答