Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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中的re.sub中获取组匹配_Python_Regex_Perl - Fatal编程技术网

在Python中的re.sub中获取组匹配

在Python中的re.sub中获取组匹配,python,regex,perl,Python,Regex,Perl,在Perl中,我可以同时进行替换和捕获组匹配。e、 g my $string = "abcdef123"; $string =~ s/(\d+)//; my $groupMatched = $1; # $groupMatched is 123 在Python中,我可以使用re.sub函数进行替换,如下所示。但是,如果不调用另一个函数re.match并执行其他操作,我无法找到捕获\d+组匹配的方法 string = "abcdef123" string = re.sub("(\d+)", "",

在Perl中,我可以同时进行替换和捕获组匹配。e、 g

my $string = "abcdef123";
$string =~ s/(\d+)//;
my $groupMatched = $1; # $groupMatched is 123
在Python中,我可以使用re.sub函数进行替换,如下所示。但是,如果不调用另一个函数re.match并执行其他操作,我无法找到捕获\d+组匹配的方法

string = "abcdef123"
string = re.sub("(\d+)", "", string)
有人知道如何从相同的re.sub操作中将“\d+”匹配值捕获为单独的变量吗?我尝试了以下命令,但无效

print r'\1'

您可以执行以下操作:

sub_str = re.search("(\d+)", str).group(1)
str = "foobarzoo"
match = re.search(r"foo(bar)", str)
将找到“123”部分

然后替换它:

str = str.replace(sub_str, "")

请注意,如果您有超过[0-9]个序列,则需要使用
findall
并手动迭代所有匹配项。

您可以欺骗并将函数传递给
re.sub

results = []
def capture_and_kill(match):
    results.append(match)
    return ""
string = "abcdef123"
string = re.sub("(\d+)", capture_and_kill, string)
results[0].group(1)
# => '123'

下面是在python 3.6下测试的代码

test = "abcdef123"
resp = re.sub(r'\w+[A-Za-z](\d+)',r'\1',test)
print (resp)

123

要基于Marouns答案,您还可以执行以下操作:

sub_str = re.search("(\d+)", str).group(1)
str = "foobarzoo"
match = re.search(r"foo(bar)", str)
然后将其替换为完全匹配的“foobar”:

第一组(括号内)“酒吧”可通过以下方式访问:

match.group(1)

使用此方法str将最终等于“zoo”

我不确定这是否可行(至少同时如此),因为
re.sub
的返回对象是字符串。如果你有这样的东西,
rx_obj=re.search('123$',另一个字符串)
,你会得到一个re对象,它可以被
rx_obj.group()
捕获。你可能是对的,不可能同时做这两件事。其他方法似乎有点老套,或者基本上是两个独立的步骤。请注意,在Perl中,在使用特殊编号的变量之前,您应该始终验证匹配是否成功:
if($str=~s/(\d+/){$x=$1;}
此答案不正确,或者至少不是很一般-您不能假设将
sub_str
作为字符串查找与将原始模式作为正则表达式查找相同。例如,如果模式是
r“foo(?!bar)”
,它将仅在位置6匹配
“foobarfoo”
,但匹配的字符串
“foo”
出现在位置0和6处。这并不能回答问题-它只是碰巧返回与
\1
相同的字符串,因为您的替换模式是
r'\1'
。这不是所讨论的Perl代码的完全等价物<代码>str=“foobarfoobar”;匹配=重新搜索(r'^foo(bar)”,str);str=str.replace(match.group(0),“”)我们希望
str
变成
“foobar”
,它变成
“”
结果[0]。group()[1]