0

我正在尝试将文本中的一些值导出到 txt 文件。我的文字有这种形式:

"a='one' b='2' c='3' a='two' b='8' c='3'"

我想导出键“a”的所有值结果必须像

one
two
4

5 回答 5

3

其他答案对于您的特定情况是正确的,但我认为带有lookbehind/lookahead 的正则表达式是一个更通用的解决方案,即:

import re

text = "a='one' b='2' c='3' a='two' b='8' c='3'"

expr = r"(?<=a=')[^']*(?=')"

matches = re.findall(expr,text)
for m in matches:
    print m  ##or whatever

这将匹配以 a= 开头的单引号之间的任何表达式,即 a='xyz'、a='my#1.abcd' 和 a='a=5%' 都将匹配

于 2012-08-20T09:28:34.947 回答
2

这个正则表达式很容易理解:

pattern = r"a='(.*?)'"

它不使用环视(如(?<=a=')[^']*(?=')) - 所以它非常简单..

整个程序:

#!/usr/bin/python

import re

text = "a='one' b='2' c='3' a='two' b='8' c='3'"
pattern = r"a='(.*?)'"

for m in re.findall( pattern, text ):
  print m
于 2012-08-20T09:51:50.373 回答
0

你可以使用这样的东西:

import re
r = re.compile(r"'([a-z]+)'")

f = open('input')
text = f.read()

m = r.finditer(text)

for mm in m:
    print mm.group(1)
于 2012-08-20T09:12:28.077 回答
0

以为我会给出一个没有re的解决方案:

>>> text = "a='one' b='2' c='3' a='two' b='8' c='3'"
>>> step1 = text.split(" ")
>>> step1
["a='one'", "b='2'", "c='3'", "a='two'", "b='8'", "c='3'"]
>>> step2 = []
>>> for pair in step1:
    split_pair = pair.split("=")
    step2.append([split_pair[0],split_pair[1]]) 
>>> print step2
[['a', "'one'"], ['b', "'2'"], ['c', "'3'"], ['a', "'two'"], ['b', "'8'"], ['c', "'3'"]]
>>> results = []
>>> for split_pair in step2:
        if split_pair[0] == "a":
            results.append(split_pair[1])   
>>> results
["'one'", "'two'"]

不是最优雅的方法,但它有效。

于 2012-08-20T09:19:31.757 回答
0

另一个非正则表达式解决方案:您可以使用shlex模块和.partition方法(或.split()with maxsplit=1):

>>> import shlex
>>> s = "a='one' b='2' c='3' a='two' b='8' c='3'"
>>> shlex.split(s)
['a=one', 'b=2', 'c=3', 'a=two', 'b=8', 'c=3']
>>> shlex.split(s)[0].partition("=")
('a', '=', 'one')

所以很简单

>>> for group in shlex.split(s):
...     key, eq, val = group.partition("=")
...     if key == 'a':
...         print val
... 
one
two

有很多相同的变化。

于 2012-08-20T09:40:18.290 回答