如何解析python中同一个字符串后面出现的值?

How to parse values appear after the same string in python?

我有一个这样的输入文本(实际文本文件也包含围绕这 2 个字符串的大量垃圾字符。)

(random_garbage_char_here)**value=xxx**;(random_garbage_char_here)**value=yyy**;(random_garbage_char_here)

我正在尝试解析文本以存储如下内容: value1="xxx"value2="yyy"。 我写了python代码如下:

value1_start = content.find('value')
value1_end = content.find(';', value1_start)

value2_start = content.find('value')
value2_end = content.find(';', value2_start)


print "%s" %(content[value1_start:value1_end])
print "%s" %(content[value2_start:value2_end])

但它总是returns:

value=xxx
value=xxx

谁能告诉我如何解析文本以便输出为:

value=xxx
value=yyy

对于此输入:

content = '(random_garbage_char_here)**value=xxx**;(random_garbage_char_here)**value=yyy**;(random_garbage_char_here)'

使用简单的正则表达式并手动去除第一个和最后两个字符:

import re

values = [x[2:-2] for x in re.findall(r'\*\*value=.*?\*\*', content)]
for value in values:
    print(value)

输出:

value=xxx
value=yyy

这里假设总是有两个前导和两个尾随 *,如 **value=xxx**.

使用正则表达式方法:

re.findall(r'\bvalue=[^;]*', s)

或者 - 如果 value 可以是任何 1+ 个单词 (letter/digit/underscore) 个字符:

re.findall(r'\b\w+=[^;]*', s)

regex demo

详情:

  • \b - 单词边界
  • value= - 文字字符序列 value=
  • [^;]* - ;.
  • 以外的零个或多个字符

查看 Python demo:

import re
rx = re.compile(r"\bvalue=[^;]*")
s = "$%$%&^(&value=xxx;$%^$%^$&^%^*value=yyy;%$#^%"
res = rx.findall(s)
print(res)

使用正则表达式从 "junk characters":

中过滤您想要的数据
>>> import re
>>> _input = '#4@5%value=xxx38u952035983049;3^&^*(^%value=yyy#%$#^&*^%;$#%$#^'
>>> matches = re.findall(r'[a-zA-Z0-9]+=[a-zA-Z0-9]+', _input)
>>> matches
['value=xxx', 'value=yyy']
>>> for match in matches:
    print(match)


value=xxx
value=yyy
>>> 

总结或正则表达式:

  • [a-zA-Z0-9]+:一个或多个字母数字字符
  • =:字面等号
  • [a-zA-Z0-9]+:一个或多个字母数字字符

基于 re 模块,您已经有了很好的答案。那当然是最简单的方法了。

如果出于任何原因(性能?)您更喜欢使用 str 方法,这确实是可能的。但是您必须搜索第一个字符串末尾之后的第二个字符串:

value2_start = content.find('value', value1_end)
value2_end = content.find(';', value2_start)