заменить часть слова на регулярное выражение - PullRequest
0 голосов
/ 11 ноября 2010

как удалить текст внутри <ref> *some text*</ref> вместе с самим ref?

в '...and so on<ref>Oxford University Press</ref>.'

re.sub(r'<ref>.+</ref>', '', string) удаляет <ref> только если <ref> сопровождается пробелом

РЕДАКТИРОВАТЬ: это связано с границами слов, я думаю ... или?

EDIT2 Что мне нужно, так это то, что он будет последним (закрывающим) </ref>, даже если он находится на новой строке.

Ответы [ 4 ]

3 голосов
/ 11 ноября 2010

Я не вижу вашей проблемы, потому что вставленный код удалит часть строки <ref>...</ref>. Но если вы имеете в виду, что пустой тег ref не удаляется:

re.sub(r'<ref>.+</ref>', '', '...and so on<ref></ref>.')

Тогда вам нужно изменить. + На. *

A + означает один или несколько, а * означает ноль или более.

С http://docs.python.org/library/re.html:

'.' (Dot.) In the default mode, this matches any character except a newline.
    If the DOTALL flag has been specified, this matches any character including
    a newline.
'*' Causes the resulting RE to match 0 or more repetitions of the preceding
    RE, as many repetitions as are possible. ab* will match ‘a’, ‘ab’, or ‘a’
    followed by any number of ‘b’s.
'+' Causes the resulting RE to match 1 or more repetitions of the preceding
    RE. ab+ will match ‘a’ followed by any non-zero number of ‘b’s; it will
    not match just ‘a’.
'?' Causes the resulting RE to match 0 or 1 repetitions of the preceding RE.
    ab? will match either ‘a’ or ‘ab’.
1 голос
/ 11 ноября 2010

Вы могли бы сделать необычное регулярное выражение, чтобы делать именно то, что вы намеревались, но вам нужно использовать DOTALL и не жадный поиск, и вам нужно понять, как регулярные выражения работают в целом, а вы - нет.

Лучше всего использовать строковые методы, а не регулярные выражения, что в любом случае является более питоническим:

while '<reg>' in string:
    begin, end = string.split('<reg>', 1)
    trash, end = end.split('</reg>', 1)
    string = begin + end

Если вы хотите быть очень универсальным, позволяя использовать странные заглавные буквы тегов или пробелов и свойств в тегах,Вам также не следует этого делать, но вкладывайте средства в изучение библиотеки разбора html / xml. lxml в настоящее время широко рекомендуется и поддерживается.

1 голос
/ 11 ноября 2010

Возможно, вы захотите быть осторожным, чтобы не удалить весь текст только потому, что имеется более одного закрывающего </ref> с.Ниже, на мой взгляд, регулярное выражение будет более точным:

r'<ref>[^<]*</ref>'

Это предотвратит «жадное» сопоставление.

Кстати: существует отличный инструмент, который называется Regex Coach для анализа и тестирования вашихрегулярные выражения.Вы можете найти его по адресу: http://www.weitz.de/regex-coach/

edit: забыл добавить кодовый тег в первый абзац.

0 голосов
/ 11 ноября 2010

Если вы попытаетесь сделать это с помощью регулярных выражений, вы попадете в мир проблем . Вы фактически пытаетесь что-то проанализировать, но ваш анализатор не справляется с этой задачей.

Жадное совпадение между строками, вероятно, слишком много съедает, как в этом примере:

<ref>SDD</ref>...<ref>XX</ref>

В итоге вы очистите всю середину.

Вы действительно хотите парсер, что-то вроде Beautiful Soup .

from BeautifulSoup import BeautifulSoup, Tag
s = "<a>sfsdf</a> <ref>XX</ref> || <ref>YY</ref>"
soup = BeautifulSoup(s)
x = soup.findAll("ref")
for z in x:
  soup.ref.replaceWith('!')
soup # <a>sfsdf</a> ! || !
...