我正在尝试将文本中的一些值导出到 txt 文件。我的文字有这种形式:
"a='one' b='2' c='3' a='two' b='8' c='3'"
我想导出键“a”的所有值结果必须像
one
two
其他答案对于您的特定情况是正确的,但我认为带有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%' 都将匹配
这个正则表达式很容易理解:
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
你可以使用这样的东西:
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)
以为我会给出一个没有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'"]
不是最优雅的方法,但它有效。
另一个非正则表达式解决方案:您可以使用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
有很多相同的变化。