Python使用正则表达式和replace()函数查找特定字符之间的子串

13

假设我有一个字符串,里面含有很多随机的东西,就像下面这样:

strJunk ="asdf2adsf29Value=five&lakl23ljk43asdldl"

我希望获取在“Value=”和“&”之间的子字符串,在这个例子中应该是“five”。

我可以使用以下正则表达式:

 match = re.search(r'Value=?([^&>]+)', strJunk)
 >>> print match.group(0)
 Value=five
 >>> print match.group(1)
 five

为什么match.group(0)是整个字符串 'Value=five' 而group(1)只是 'five'?我是否有办法只获取 'five' 作为唯一的结果?(这个问题源于我对正则表达式的理解薄弱)

我还需要在这个字符串中进行替换,例如以下内容:

 val1 = match.group(1)
 strJunk.replace(val1, "six", 1)    

这将产生:

 'asdf2adsf29Value=six&lakl23ljk43asdldl'

考虑到我计划反复执行上述两个任务(查找'Value='和'&'之间的字符串,以及替换该值),我想知道是否有其他更有效的方法来查找子字符串并在原始字符串中替换它。我可以继续使用现有的方法,但我只是想确保如果有更好的方法存在,我不会浪费更多时间。

3个回答

9

命名分组使得之后获取分组内容变得更加容易。编译你的正则表达式一次,然后重复使用编译过的对象,比每次调用re.search重新编译更加高效。你可以使用正向回顾和零宽度正预测断言来使得这个正则表达式适用于你想要进行的替换。

>>> value_regex = re.compile("(?<=Value=)(?P<value>.*?)(?=&)")
>>> match = value_regex.search(strJunk)
>>> match.group('value')
'five'
>>> value_regex.sub("six", strJunk)
'asdf2adsf29Value=six&lakl23ljk43asdldl'

Mahmoud Abelkader的答案也可以使用 - 只要您保证“=”和“&”不会出现在strJunk的任何其他位置。 - David German

2
我不确定你是否正在解析URL,如果是的话,你应该绝对使用urlparse模块。
然而,考虑到这不是你的问题,使用正则表达式在Python中分割多个字段的能力非常快,因此你应该可以按照以下方式完成你想要的操作:
import re

strJunk ="asdf2adsf29Value=five&lakl23ljk43asdldl"
split_result = re.split(r'[&=]', strJunk)
split_result[1] = 'six'
print "{0}={1}&{2}".format(*split_result)

希望这有所帮助!
编辑:
如果你需要多次分割,可以使用re.compile()来编译正则表达式。那么你就会有:
import re
rx_split_on_delimiters = re.compile(r'[&=]')  # store this somewhere

strJunk ="asdf2adsf29Value=five&lakl23ljk43asdldl"
split_result = rx_split_on_delimiters.split(strJunk)
split_result[1] = 'six'
print "{0}={1}&{2}".format(*split_result)

0

为什么match.group(0)是'Value=five'整个字符串,而group(1)只是'five'?是否有办法让我只获得'five'作为唯一结果?(这个问题源于我对正则表达式掌握不牢)

我认为后顾断言可以在这里帮助你。

>>> match = re.search(r'(?<=Value=)([^&>]+)', strJunk)
>>> match.group(0)
'five'

但是在后顾断言中,您只能提供一个固定长度的字符串。

>>> match = re.search(r'(?<=Value=?)([^&>]+)', strJunk)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/re.py", line 142, in search
    return _compile(pattern, flags).search(string)
  File "/usr/lib/python2.6/re.py", line 245, in _compile
    raise error, v # invalid expression
sre_constants.error: look-behind requires fixed-width pattern

我想不到没有正则表达式的方法来做这个。你的方法应该比look behind断言更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接