Python—修改反向引用。能做到吗?

Python—修改反向引用。能做到吗?,python,regex,Python,Regex,Python新手,请原谅我的无知。我正在尝试修改正则表达式中的反向引用字符串 例如: >>>a_string 'fsa fad fdsa dsafasdf u.s.a. U.S.A. u.s.a fdas adfs.f fdsa f.afda' >>> re.sub(r'(?<=\s)(([a-zA-Z]\.)+[a-zA-Z]\.{0,1})(?=\s)', '<acronym>'+re.sub(r'\.',r'',(r'\1').uppe

Python新手,请原谅我的无知。我正在尝试修改正则表达式中的反向引用字符串

例如:

>>>a_string
'fsa fad fdsa dsafasdf u.s.a. U.S.A. u.s.a fdas adfs.f fdsa f.afda'
>>> re.sub(r'(?<=\s)(([a-zA-Z]\.)+[a-zA-Z]\.{0,1})(?=\s)', '<acronym>'+re.sub(r'\.',r'',(r'\1').upper())+'</acronym>', a_string)
'fsa fad fdsa dsafasdf <acronym>u.s.a.</acronym> <acronym>U.S.A.</acronym> <acronym>u.s.a</acronym> fdas adfs.f fdsa f.afda'
>>一个字符串
“fsa fad fdsa dsafasdf u.s.a.u.s.a fdas adfs.f fdsa f.afda”
>>>关于sub(r'(?来自:

如果repl是一个函数,则会对模式的每一次非重叠出现调用它。该函数采用单个匹配对象参数,并返回替换字符串。例如:


请参阅链接文档中包含的示例。

正如Ignacio Vazquez Abrams所建议的,您可以通过将可调用函数传递到
re.sub()
来解决问题。我认为示例代码可以最好地解释它,所以现在开始:

import re

s = "fsa fad fdsa dsafasdf u.s.a. U.S.A. u.s.a fdas adfs.f fdsa f.afda"

s_pat = r'(?<=\s)(([a-zA-Z]\.)+[a-zA-Z]\.{0,1})(?=\s)'
pat = re.compile(s_pat)

def add_acronym_tag(match_object):
    s = match_object.group(0)
    s = s.replace('.', '').upper()
    return "<acronym>%s</acronym>" % s

s = re.sub(pat, add_acronym_tag, s)
print s
重新导入
s=“fsa fad fdsa dsafasdf u.s.a.u.s.a fdas adfs.f fdsa f.afda”
s_pat=r’(?修改反向引用”需要重新措辞,因为您似乎混淆了概念

是字符串中字符的特殊组合,它告诉正则表达式引擎引用在匹配操作期间检索到的某些特定捕获组值(也称为子匹配)

当您使用
r'\1'.upper()
时,您试图使
\1
字符串大写,并且由于
\1
没有大写字母,因此您得到
\1
,并且此
\1
-未更改-作为字符串替换模式的(部分)应用

这就是为什么不能以这种方式修改捕获组值


这就是为什么您必须(请参见):您需要将match对象传递给
re.sub
,以便能够手动生成子匹配(尽管您当然可以在backrefence中替换一两个字符,例如,
r'\g)。replace('2','1')
以“模糊”
\g
backreference,但此操作没有什么意义).

请原谅我的无知,但我不知道这对我有什么帮助。该示例不使用反向引用。当我取出反向引用并(比如)插入伪字符串时,效果很好。问题在于修改反向引用字符串(我认为)。您是否尝试返回替换字符串?谢谢,这很有帮助。但我仍然不确定我最初的尝试为什么不起作用。re.sub()和upper()不算作可调用函数吗?它们算作可调用函数。但是
re.sub()
调用该函数并传递一个参数:“匹配对象”。
re.sub()
str.upper()
不知道如何处理匹配对象。再看看我的函数;它做的第一件事是从匹配对象中提取字符串。因此,您需要编写一个包装函数,调用
re.sub()
str.replace()
str.upper())
;包装器需要使用匹配对象作为参数;包装器不需要使用任何其他参数来告诉它该做什么。发布目的是为了让它看起来更清晰。
import re

s = "fsa fad fdsa dsafasdf u.s.a. U.S.A. u.s.a fdas adfs.f fdsa f.afda"

s_pat = r'(?<=\s)(([a-zA-Z]\.)+[a-zA-Z]\.{0,1})(?=\s)'
pat = re.compile(s_pat)

def add_acronym_tag(match_object):
    s = match_object.group(0)
    s = s.replace('.', '').upper()
    return "<acronym>%s</acronym>" % s

s = re.sub(pat, add_acronym_tag, s)
print s
fsa fad fdsa dsafasdf <acronym>USA</acronym> <acronym>USA</acronym> <acronym>USA</acronym> fdas adfs.f fdsa f.afda