Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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/20.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正则表达式(?P=name)不';行不通_Python_Regex_Python 3.x - Fatal编程技术网

为什么python正则表达式(?P=name)不';行不通

为什么python正则表达式(?P=name)不';行不通,python,regex,python-3.x,Python,Regex,Python 3.x,我正在学习Python的“re”部分,命名模式(?p=name)让我困惑 当我使用re.sub()交换数字和字符时,模式“(?p=name)”不起作用,但模式“\N”和“\g”仍然有意义。代码如下: [IN]print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'(?P=char)-(?P=digit)', '123-abcd')) [OUT] (?P=char)-(?P=digit) [IN] print(re.sub(r

我正在学习Python的“
re
”部分,命名模式
(?p=name)
让我困惑

当我使用
re.sub()
交换数字和字符时,模式“
(?p=name)
”不起作用,但模式“
\N
”和“
\g
”仍然有意义。代码如下:

[IN]print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'(?P=char)-(?P=digit)', '123-abcd'))
[OUT] (?P=char)-(?P=digit)
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\2-\1', '123-abcd'))
[OUT] abcd-123
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\g<char>-\g<digit>', '123-abcd'))
[OUT] abcd-123
[IN]打印(re.sub(r'(?P\d{3})-(P\w{4});(r'(?P=char)-(P=digit);'123 abcd'))
[OUT](?P=字符)-(P=数字)
[IN]print(re.sub(r'(?P\d{3})-(?P\w{4}'),r'\2-\1',123 abcd'))
[OUT]abcd-123
[IN]print(re.sub(r'(?P\d{3})-(?P\w{4}),r'\g-\g',123 abcd'))
[OUT]abcd-123
为什么我使用
(?p=name)

如何正确使用它?
我使用的是Python3.5,
(?p=name)
是一个内联(in模式)反向引用。您可以在正则表达式模式中使用它来匹配由相应的命名捕获组捕获的相同内容,请参见:

(?p=name)

对命名组的反向引用;它匹配先前名为name的组所匹配的任何文本

请参阅:
(?p\d{3})-(?p\w{4})和(?p=char)-(?p=digit)
匹配
123 abcd&abcd-123
,因为“digit”组匹配并捕获
123
,“char”组捕获
abcd
,然后命名的内联反向引用匹配
abcd
123

要替换匹配项,请使用带有替换模式的
\1
\g
\g
语法。不要为此目的使用
(?P=name)

repl可以是字符串或函数。。。反向引用(如
\6
)将替换为模式中与组6匹配的子字符串

在字符串类型repl参数中,除了上面描述的字符转义和反向引用之外,
\g
将使用由
(?P..
语法定义的名为name的组匹配的子字符串
\g
使用相应的组号<因此,code>\g相当于
\2
,但在诸如
\g0
之类的替换中并不含糊<代码>\20将被解释为对组20的引用,而不是对组2后跟文字字符“0”的引用。backreference
\g
替换由RE匹配的整个子字符串


您可以查看使用和反向引用的详细信息?p访问:

https://docs.python.org/3/library/re.html
并在浏览器中使用CTRL+F查找(?p…)。它是一个很好的图表,上面有关于何时可以使用?P=name的所有说明

对于本例,您在第三次调用re.sub()时做得很好

在all re.sub()调用中,您只能在该方法的第一个字符串参数中使用?p=name语法,而在第二个字符串参数中不需要它,因为您有\g语法

如果您混淆了?p=名称是否有用,那么它是有用的,但用于通过反向引用已命名的字符串进行匹配

示例:您希望匹配potatoXXXpotato并将其替换为YYXXXYY。你可以:

re.sub(r'(?P<myName>potato)(XXX)(?P=myName)', r'YY\2YY', 'potatoXXXpotato')
re.sub(r'(?Ppotato)(XXX)(?P=myName)'、r'YY\2YY'、'potatoXXXpotato')

re.sub(r'(?Ppotato)(?PXXX)(?P=myName)'、r'YY\gYY'、'potatoXXXpotato')

(?P=name)
是一个模式内反向引用。您不能在替换模式中使用它。您试图用“?P=name”?实现什么?谢谢,现在我知道了,我应该使用谢谢!你帮了我一个大忙,给我举了个正确的例子。不客气。文档也很有用,下次请记住这一点:-)
re.sub(r'(?P<myName>potato)(?P<triple>XXX)(?P=myName)', r'YY\g<triple>YY', 'potatoXXXpotato')