Python - Изменение обратной ссылки. Это можно сделать? - PullRequest
4 голосов
/ 02 сентября 2011

Впервые в 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'

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Как предложил Игнасио Васкес-Абрамс, вы можете решить свои проблемы, передав функцию, вызываемую в 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(), потому что вы просто хотите избавиться от одного символа, и для этого вам не нужны все возможности регулярных выражений.

2 голосов
/ 02 сентября 2011

С документы :

Если repl является функцией, она вызывается для каждого неперекрывающегося вхождения pattern . Функция принимает один аргумент объекта сопоставления и возвращает строку замены. Например:

И посмотрите пример, содержащийся в связанных документах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...