RegEx для замены всех групп одной строкой - PullRequest
0 голосов
/ 09 июня 2019

Например, у меня есть эта строка:

<ul><li><ahref="http://test.com">sometext</a></li></ul>

, и я хочу этот вывод:

<ul><li>[URL href="http://test.com"]sometext[/URL]</li></ul>

Поэтому я создаю это регулярное выражение для совпадений <ahref - первая группа,"> - вторая группа и </a> - третья группа, для замены их на [URL для первой группы, "] для второй группы и [/URL] для третьей группы:

pattern = r'(<a ?href).+(">).+(<\/a>)'

Соответствуетгруппы, но теперь я не знаю, как их заменить.

Ответы [ 2 ]

3 голосов
/ 09 июня 2019

Здесь мы собираем то, что хотим заменить, используя 4 группы захвата, с выражением, похожим на:

(<ul><li>)<a\s+href=\"(.+?)\">(.+?)<\/a>(<\/li><\/ul>)

Демо 1

Для пропущенного места мы просто использовали бы:

(<ul><li>)<ahref=\"(.+?)\">(.+?)<\/a>(<\/li><\/ul>)

Демо 2

Если бы у нас были оба экземпляра, мы добавили бы необязательную группу пробелов, используя группу захвата или отсутствия захвата:

(<ul><li>)<a(\s+)?href=\"(.+?)\">(.+?)<\/a>(<\/li><\/ul>)

Демо 3

Test

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(<ul><li>)<a\s+href=\"(.+?)\">(.+?)<\/a>(<\/li><\/ul>)"

test_str = "<ul><li><a href=\"http://test.com\">sometext</a></li></ul>
"

subst = "\\1[URL href=\"\\2\"]\\3[/URL]\\4"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

1 голос
/ 09 июня 2019
import re
text = "<ul><li><ahref=\"http://test.com\">sometext</a></li></ul>"
pattern = r'(<a ?href).+(">).+(<\/a>)'
url = re.findall('".*"', text)[0]
value = re.findall('>\w+<', text)[0][1:-1]
new_text = re.sub(pattern, '[URL href=' + url + "]" + value + '[/URL]', text)
print(new_text)
...