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 <acronym>USA</acronym> <acronym>USA</acronym> <acronym>USA</acronym> fdas adfs.f fdsa f.afda'谢谢你的帮助。
发布于 2011-09-02 12:27:22
来自the docs
如果
是一个函数,则每次出现非重叠的pattern时都会调用它。此函数接受单个匹配对象参数,并返回替换字符串。例如:
并查看链接文档中包含的示例。
发布于 2011-09-02 13:16:43
正如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上面的打印结果:
fsa fad fdsa dsafasdf <acronym>USA</acronym> <acronym>USA</acronym> <acronym>USA</acronym> fdas adfs.f fdsa f.afda所以实际上你并没有修改反向引用,因为字符串是不可变的。但是这也一样好:您可以编写一个函数来执行您想要的任何处理,然后返回您想要的任何内容,这就是re.sub()将插入到最终结果中的内容。
请注意,您可以在函数中使用正则表达式;我只使用了.replace()字符串方法,因为您只想去掉单个字符,而实际上并不需要正则表达式的全部功能。
发布于 2019-09-20 16:49:51
“修改反向引用”需要重新措辞,因为你似乎混淆了这些概念。
是字符串中的特殊字符组合,它告诉正则表达式引擎引用在匹配操作期间检索到的某些特定捕获组值(也称为子匹配)。
当您使用r'\1'.upper()时,您会尝试将\1字符串变为大写,并且由于\1没有大写字母,因此您将得到\1,并且此\1 -未更改-将作为字符串替换模式的(一部分)应用。
这就是为什么不能通过这种方式修改采集组值的原因。
这就是为什么必须使用use a callable as the replacement argument (参见Ignacio's answer):您需要将match对象传递给re.sub,以便能够处理子匹配(尽管您当然可以替换后向引用中的一两个字符,例如,r'\g<12>'.replace('2','1')来“混淆”\g<11>反向引用,但是这个操作没有什么意义)。
https://stackoverflow.com/questions/7279038
复制相似问题