如何解析值出现在python中相同的字符串之后?

时间:2016-12-30 07:44:30

标签: python regex string parsing string-parsing

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

(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])

但它总会回归:

value=xxx
value=xxx

有人能告诉我如何解析文本以便输出:

value=xxx
value=yyy

4 个答案:

答案 0 :(得分:1)

对于此输入:

menuSub.on("click",function(){
 // ...
 return false; // <-- here
}

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

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 中始终存在两个前导{2}和*

答案 1 :(得分:1)

使用正则表达式方法:

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

或 - 如果value可以是任何1个字(字母/数字/下划线)字符:

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)

答案 2 :(得分:1)

使用正则表达式从&#34;垃圾字符过滤所需数据&#34;:

>>> import re
>>> _input = '#4@5%value=xxx38u952035983049;3^&^*(^%$3value=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]+:一个或多个字母数字字符

答案 3 :(得分:1)

根据re模块,您已经有了很好的答案。那肯定是最简单的方法。

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

ALTER TABLE mytable ADD FULLTEXT(data);
SELECT col1, col2, ... FROM mytable WHERE match(data) AGAINST("word1 word2 word3" in BOOLEAN MODE);