Python使用regex和replace()查找某些字符之间的子字符串

2024-04-27 03:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个字符串,其中包含许多随机的内容,如下所示:

strJunk ="asdf2adsf29Value=five&lakl23ljk43asdldl"

我有兴趣获取位于“Value=”和“amp;之间的子字符串,在本例中为“5”。

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

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

为什么match.group(0)是整个值'Value=5',group(1)只是'5'?有没有办法让我只得到5分?(这个问题源于我对regex的理解很模糊)

我还要在这个字符串中进行如下替换:

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

结果是:

 'asdf2adsf29Value=six&lakl23ljk43asdldl'

考虑到我计划一遍又一遍地执行上述两个任务(查找“Value=”和“amp;之间的字符串,以及替换该值),我想知道是否有其他更有效的方法来查找子字符串并将其替换为原始字符串。我可以坚持我所拥有的,但我只想确保如果有更好的方法,我不会占用更多的时间。


Tags: 方法字符串内容valuematchgroupamp兴趣
3条回答

命名组使以后获取组内容更容易。编译正则表达式一次,然后重用编译后的对象,比每次使用都重新编译它要高效得多(这就是重复调用re.search时所发生的情况)。您可以使用正的lookbehind和lookahead断言使此正则表达式适合您要进行的替换。

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

我不确定您是否在解析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)

为什么match.group(0)是整个值'Value=5',group(1)只是'5'?有没有办法让我只得到5分?(这个问题源于我对regex的理解很模糊)

我认为“回头看”这个断言可以帮到你。

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

但在look behind断言中只能提供一个常量字符串。

>>> 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

没有正则表达式我没办法做到这一点。你这样做的方式应该比事后看断言更快。

相关问题 更多 >