【问题标题】:Python finding substring between certain characters using regex and replace()Python使用正则表达式和replace()查找某些字符之间的子字符串
【发布时间】:2011-06-05 01:56:55
【问题描述】:

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

strJunk ="asdf2adsf29Value=five&lakl23ljk43asdldl"

我有兴趣获取位于 'Value=' 和 '&' 之间的子字符串,在本例中为 '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”?有没有办法让我只得到“五”作为唯一的结果? (这个问题源于我对正则表达式的掌握很薄弱)

我还必须在这个字符串中进行替换,如下所示:

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

产量:

 'asdf2adsf29Value=six&lakl23ljk43asdldl'

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

【问题讨论】:

    标签: python regex string replace


    【解决方案1】:

    命名组使之后更容易获取组内容。编译一次你的正则表达式,然后重用编译的对象,将比每次使用重新编译它更有效(当你重复调用 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 的其他任何地方。
    【解决方案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)
    

    【讨论】:

      【解决方案3】:

      为什么 match.group(0) 是整个“Value=5”而 group(1) 只是“5”?有没有办法让我只得到“五”作为唯一的结果? (这个问题源于我对正则表达式的掌握很薄弱)

      我认为查看断言可以在这里为您提供帮助。

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

      如果没有正则表达式,我无法做到这一点。您这样做的方式应该比查看断言更快。

      【讨论】:

        猜你喜欢
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 2022-11-02
        • 2016-05-16
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        • 1970-01-01
        相关资源
        最近更新 更多