2011-08-03 18 views

Odpowiedz

160

Trzeba zbudować regex jako ciąg:

TEXTO = sys.argv[1] 
my_regex = r"\b(?=\w)" + re.escape(TEXTO) + r"\b(?!\w)" 

if re.search(my_regex, subject, re.IGNORECASE): 
    etc. 

Zauważ użycie re.escape tak, że jeśli tekst zawiera znaki specjalne, nie będą one interpretowane jako takie.

+12

+1 za odniesienie do re.escape, nie zauważyłem tego w dokumentach wcześniej! – bdeniker

+2

Co się stanie, jeśli zmienna przejdzie pierwsza? 'r '' + foo + 'bar''? – deed02392

+0

@ deed02392 'r''' nie jest konieczne, jeśli robisz' re.escape (foo) ', które i tak powinieneś. Właściwie, myślę, że 're' interpretuje cokolwiek jest podane jako ciąg znaków Unicode, niezależnie od tego, czy prefiksujesz' r' czy nie. – OJFord

19
rx = r'\b(?<=\w){0}\b(?!\w)'.format(TEXTO) 
+0

+1 ponieważ interpolacja ciąg zniknie. – Chris

+3

:-) Wątpię, czy interpolacja ciągów kiedykolwiek zniknie ... –

+1

@phasetwenty: Nie, nie jest. Bardziej lubię formatować, ale twórcy Pythona nie planują usuwania starej składni printf. –

32
if re.search(r"\b(?<=\w)%s\b(?!\w)" % TEXTO, subject, re.IGNORECASE): 

To wstawić co jest w Texto do regex jako ciąg znaków.

1

zgadzam się ze wszystkimi powyżej, chyba że:

sys.argv[1] było coś Chicken\d{2}-\d{2}An\s*important\s*anchor

sys.argv[1] = "Chicken\d{2}-\d{2}An\s*important\s*anchor" 

nie chcesz używać re.escape, ponieważ w tym przypadku będzie go chciał zachowywać się jak regex

TEXTO = sys.argv[1] 

if re.search(r"\b(?<=\w)" + TEXTO + "\b(?!\w)", subject, re.IGNORECASE): 
    # Successful match 
else: 
    # Match attempt failed 
1

Potrzebowałem wyszukać nazwy użytkowników, które są do siebie podobne, i co powiedział Ned Batchelder bardzo pomocny. Uważam jednak, miałem czystsze wyjście kiedy użyłem re.compile tworzyć kryteria wyszukiwania ponownego wyrażenia:

pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)" 
matches = re.findall(pattern, lines) 

wyjściowe mogą być drukowane przy użyciu następujących:

print(matches[1]) # prints one whole matching line (in this case, the first line) 
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line. 
1

Uważam, że bardzo wygodne do budowy wzór wyrażenia regularnego poprzez łączenie wielu mniejszych wzorców.

import re 

string = "begin:id1:tag:middl:id2:tag:id3:end" 
re_str1 = r'(?<=(\S{5})):' 
re_str2 = r'(id\d+):(?=tag:)' 
re_pattern = re.compile(re_str1 + re_str2) 
match = re_pattern.findall(string) 
print(match) 

wyjściowa:

[('begin', 'id1'), ('middl', 'id2')] 
Powiązane problemy