Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换单行中的所有正则表达式匹配项_Python_Regex - Fatal编程技术网

Python 替换单行中的所有正则表达式匹配项

Python 替换单行中的所有正则表达式匹配项,python,regex,Python,Regex,我有一个动态regexp,我事先不知道它有多少个组 我想用xml标记替换所有匹配项 范例 re.sub("(this).*(string)","this is my string",'<markup>\anygroup</markup>') >> "<markup>this</markup> is my <markup>string</markup>" re.sub(“(this)。*(string)”,“th

我有一个动态regexp,我事先不知道它有多少个组 我想用xml标记替换所有匹配项

范例

re.sub("(this).*(string)","this is my string",'<markup>\anygroup</markup>')
>> "<markup>this</markup> is my <markup>string</markup>"
re.sub(“(this)。*(string)”,“this is my string”,“\anygroup”)
>>“这是我的绳子”

甚至在单行中也可以这样做吗?

re.sub()
将取代它所能替代的一切。如果您为它传递一个函数,用于
repl
,则可以执行更多操作。

对于您的示例中的常量regexp,请执行以下操作

re.sub("(this)(.*)(string)",
       r'<markup>\1</markup>\2<markup>\3</markup>',
       text)
re.sub((this)(.*)(string)”,
r'\1\2\3',
(文本)
请注意,如果您不想丢失它,还需要将。*括在括号中

现在,如果您不知道regexp看起来是什么样子,那么它会更困难,但应该是可行的

pattern = "(this)(.*)(string)"
re.sub(pattern,
       lambda m: ''.join('<markup>%s</markup>' % s if n % 2 == 0
                         else s for n, s in enumerate(m.groups())),
       text)
pattern=“(此)(*)(字符串)”
关于子(模式,
lambda m:“”。如果n%2==0,则加入(“%s”%s
else s表示n,s在枚举(m.groups())中,
(文本)
如果与您的模式匹配的第一个内容不一定要标记,请改用此选项,第一组可以选择匹配一些应该单独保留的前缀文本:

pattern = "()(this)(.*)(string)"
re.sub(pattern,
       lambda m: ''.join('<markup>%s</markup>' % s if n % 2 == 1
                         else s for n, s in enumerate(m.groups())),
       text)
pattern=“()(this)(*)(string)”
关于子(模式,
lambda m:“”。如果n%2==1,则加入(“%s”%s
else s表示n,s在枚举(m.groups())中,
(文本)
你明白了

如果您的regexp很复杂,并且您不确定是否可以将所有内容都作为一个组的一部分,在这个组中只需要标记每一个组,那么您可以使用更复杂的函数来做一些更聪明的事情:

pattern = "(this).*(string)"
def replacement(m):
    s = m.group()
    n_groups = len(m.groups())
    # assume groups do not overlap and are listed left-to-right
    for i in range(n_groups, 0, -1):
        lo, hi = m.span(i)
        s = s[:lo] + '<markup>' + s[lo:hi] + '</markup>' + s[hi:]
    return s
re.sub(pattern, replacement, text)
pattern=“(此)。*(字符串)”
def更换(m):
s=m.群()
n_groups=len(m.groups())
#假设组不重叠,从左到右列出
对于范围内的i(n_组,0,-1):
lo,hi=m.span(i)
s=s[:低]+''+s[lo:hi]+''+s[hi:]
返回s
re.sub(模式、替换、文本)

如果您需要处理重叠的组,您可以自己处理,但这应该是可行的。

是的,这可以在一行中完成

pattern = "(this)(.*)(string)"
re.sub(pattern,
       lambda m: ''.join('<markup>%s</markup>' % s if n % 2 == 0
                         else s for n, s in enumerate(m.groups())),
       text)
>>> re.sub(r"\b(this|string)\b", r"<markup>\1</markup>", "this is my string")
'<markup>this</markup> is my <markup>string</markup>'

我希望我的匹配出现在\1\2\3之间。。这是我一直在寻找的正确答案!lamba m中的m代表什么?表示匹配的。