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)

ただし、[] 以外は印刷されません。

2番目の問題は、次のようなことを試したことです

line = 'string1 string2 string3'

その後

print re.findall(r"(?<=string1) (.*?) (?=string3)", line)

これは私が望むものを与えますが、試してみると

file.write(re.findall(r"(?<=string1) (.*?) (?=string3)", line))

(もちろん、書きたいファイルは事前に定義されているので、そこに書き込むことができます)

「TypeError: expected a character buffer object」というメッセージが表示されます

それでは、私の質問を 1 つの完全な文
で説明します。特定の文字列の間の文字列を抽出してファイルに保存するにはどうすればよいですか?

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

これは、あなたの望むことですか?

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 に答える
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 に答える