如何解析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)
详情:
\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)
我有一个这样的输入文本(实际文本文件也包含围绕这 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)
详情:
\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)