Próbuję wyodrębnić hashy z pliku i chcę dodać klauzulę graniczną (b
) wokół regex bez bezpośredniej zmiany wyrażenia regularnego.
Na przykład, weźmy to wyrażenie regularne: ^$1$w+$w+(.)?w+..$
i już go skompilowałem: re.compile(r"^$1$w+$w+(.)?w+..$")
. Teraz chcę zachować wyrażenie regularne i dodawać do niego granice bez bezpośredniej zmiany samego regex. Więc coś takiego:
def add_bound(regex_string):
return r"b{}b".format(regex_string)
Jedynym problemem, który mam z tym jest to, że moje regex są wstępnie skompilowane przed ich wykonaniem, więc zamienia je w coś takiego <_sre.SRE_Pattern object at 0x7f846a189770>
. Czy istnieje sposób dodawania granic wokół już skompilowanego wyrażenia regularnego?
Odpowiedzi:
1 dla odpowiedzi № 1Tak, możesz go zdekompilować, dodać granice, a następnie przekompilować.
import regex as re
def add_bound(regex_obj):
new_regex_string = r"b" + regex_obj.pattern + r"b"
new_regex_obj = re.compile(new_regex_string)
return new_regex_obj
# example usage
some_text = """
ahello worlda
hello world
"""
regex_obj = re.compile(r"hello world")
print re.findall(add_bound(regex_obj),some_text)
Powyższa funkcja służy do objaśnienia / ilustracji, która powinna być użyta w kodzie:
import regex as re
def add_bound(regex_obj):
return re.compile(r"b" + regex_obj.pattern + r"b")
użyłem Jak dekompilować wyrażenie regularne? aby rozwinąć tę odpowiedź
Nie jestem pewien, dlaczego Twój przykładowy regex (^$1$w+$w+(.)?w+..$
) zaczyna się i kończy kotwicami (^ i $), ponieważ w zasadzie zastąpią one dodawanie granic (b
).