【问题标题】:replacing part of the string in python 2.7替换python 2.7中的部分字符串
【发布时间】:2015-02-04 22:48:56
【问题描述】:

我为不恰当的主题标题道歉,但我不知道如何定义它。

我有一个如下所示的字符串:

string = 'b<3 and d >4 or 4<=a <20'

我想把上面的字符串改成下面的:

new_string = 'b[n]<3 and d[n] >4 or 4<=a[n] <20'

使用 string.replace 函数似乎不成功(例如:string.replace('d','d[n]'),因为字符串的其他部分也被修改了(示例结果:'b 4 或 4

我正在使用 python 2.7。 谢谢。

【问题讨论】:

    标签: python string python-2.7 replace


    【解决方案1】:

    使用re.sub;捕获组和反向引用:

    >>> import re
    >>> re.sub(r'\b([a-z])\b', r'\1[n]', 'b<3 and d >4 or 4<=a <20')
    'b[n]<3 and d[n] >4 or 4<=a[n] <20'
    

    [a-z] 匹配字母字符。 \b 用于确保变量名被word boundary 包围;使模式只匹配单个字符的变量名。

    (...) 是使模式为captured as a group(第一组),并且可以在替换字符串中引用为\1

    更新

    如果你想替换任何变量名,你可能需要检查匹配的部分是否是有效的变量。下面的例子是使用keyword.iskeyword来检查匹配的变量名是否不是关键字。

    >>> import re
    >>> import keyword
    >>>
    >>> def replace_var(m):
    ...     varname = m.group()
    ...     if keyword.iskeyword(varname) or varname[0].isdigit():
    ...         return varname
    ...     return varname + '[n]'
    ...
    >>> re.sub(r'\w+',  replace_var, 'b<3 and d >4 or 4<=a <20')
    'b[n]<3 and d[n] >4 or 4<=a[n] <20'
    

    注意:替换可以是函数,如上图;函数得到一个匹配对象,函数的返回值作为替换字符串。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2018-01-22
    • 2012-04-19
    • 1970-01-01
    • 2015-05-28
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多