Чудя се как да замени група 1 с определен низ от regex в python.
Въпрос 1:
str = "aaa bbb ccc"
regex = "baaa (bbb)b"
repl = "111 bbb 222"
Използвайте regex, за да съответствате на str, съответстващи на "aaa bbb", и заменете group1 "bbb" с "111 bbb 222" и получете резултата "aaa 111 bbb 222 ccc"
str_repl = "aaa 111 bbb 222 ccc"
Благодаря за @RomanPerekhrest и @janos 's lookbehind метод.
И се чудя как да решим по-общ сценарий:
Въпрос 2:
s1 = "bBb"
regex = "(?<=baaa )" + s1 + "b" # may not suitable
repl = "XxX " + s1 + " YyY"
мишена:
s0 = "aaa bBb ccc"
s0_repl = "aaa XxX bBb YyY ccc"
s1 = "aaa bbb ccc"
no match
s2 = "AAA bBb ccc"
s2_repl = "AAA XxX bBb YyY ccc"
Игнорирайте случая за подстрока, с изключение на s1 при съвпадение в оригиналния низ.
Question3:
s1 = "bbb"
regex = "(?<=baaa )" + s1 + "b" # may not suitable
repl = "XxX " + s1 + " YyY"
мишена:
s0 = "aaa bBb ccc"
s0_repl = "aaa XxX bBb YyY ccc"
s1 = "aaa bbb ccc"
s1_repl = "aaa XxX bbb YyY ccc"
s2 = "AAA BBB ccc"
s2_repl = "AAA XxX BBB YyY ccc"
Игнорирайте случая за подстрока, с изключение на s1 при съвпадение и заместване в оригиналния низ.
Question4:
Ако има начин да се замени група 1 на оригиналния низ от regex на python?
Отговори:
1 за отговор № 1Можете да използвате re
пакет и положителен външен вид:
import re
s = "aaa bbb ccc"
regex = r"b(?!aaa )(bbb)b"
repl = "111 bbb 222"
print(re.sub(regex, repl, s))
Това ще доведе до:
aaa 111 bbb 222 ccc
Обърнете внимание на промените, които направих там:
- Най-
aaa
префиксът в регулярния израз е опакован(?!...)
, Това означава, съвпадатbbb
ако следваaaa
, без да се включватaaa
в шаблона за замяна. Това се нарича положителен външен вид. Без тази промяна на вашия regex,aaa
ще изчезне заедно сbbb
- Редът на нормалните изрази трябва да бъде записан като
r"..."
, за да ги направи сурови струни, за да се избегнат проблеми с евакуационните последователности - Прекръстих
str
променлива доs
, защотоstr
е запазена дума в Python, както посочи и Алена.
0 за отговор № 2
Първо, не използвайте str
като име на променлива. Това е резервирана ключова дума в Python.
import re
str1 = "aaa bbb ccc"
re.sub("bbb", "111 bbb 222", str1)
Out[11]: "aaa 111 bbb 222 ccc"
0 за отговор № 3
За да замените последователността bbb
които трябва да се предхождат от последователност aaa
използвайте следния подход:
s = "aaa bbb ccc"
regex = r"(?<=aaa )bbbb"
repl = "111 bbb 222"
str_replaced = re.sub(regex, repl, s)
print(str_replaced)
Резултатът:
aaa 111 bbb 222 ccc
(?<=aaa )
- изглежда положително, гарантира това "bbb"
се предхожда от "aaa "
http://www.regular-expressions.info/lookaround.html