2012-09-23 17 views
6

Niedawno przełączyłem się na język Python i chciałbym wyczyścić bardzo dużą liczbę stron internetowych (około 12k) (ale można je uznać za równie łatwe pliki tekstowe) poprzez usunięcie niektórych znaczników lub innych wzorów łańcuchów. Do tego używam funkcji re.sub (..) w Pythonie.Zastąpienie za pomocą wielu wyrażeń regularnych lub większego w Pythonie

Moje pytanie brzmi: czy jest lepiej (z punktu widzenia wydajności), aby utworzyć jedno duże wyrażenie regularne, które pasuje do większej liczby wzorów lub wywołać funkcję kilka razy z mniejszymi i prostszymi wyrażeniami regularnymi.

Aby zilustrować, lepiej jest użyć czegoś podobnego

re.sub(r"<[^<>]*>", content) 
re.sub(r"some_other_pattern", content) 

lub

re.sub(r"<[^<>]*>|some_other_pattern",content) 

Oczywiście, ze względu na przykładowych dotychczasowe wzory są naprawdę proste, a ja ich nie skompilowany tutaj, ale w moim prawdziwym scenariuszu będę.

LE: Pytanie nie jest związane z kodem HTML plików, ale z zachowaniem Pythona, gdy mamy do czynienia z wieloma wzorami regex.

Dzięki!

+2

[Obowiązkowe ostrzeżenie o parsowaniu kodu HTML za pomocą wyrażeń regularnych] (http://stackoverflow.com/a/1732454/950912) – brc

+0

Właściwie, jak już wspomniałem, nie chodzi głównie o usuwanie i analizowanie tekstu HTML, ale o usunięcie niektórych szczególnych Wzorce związane z HTML. Moje pytanie można również postawić bardziej ogólnie na temat prostych plików tekstowych i zastępowania w nich garści wzorów. –

+0

Myślę, że sprowadza się to do tego, jak dobrze jesteś z regex ... jeśli możesz to zrobić z jednym, niż użyć jednego ... prawdopodobnie podzieliłoby to na kilka, aby łatwiej było je przeanalizować ... –

Odpowiedz

3

Zachowaj to proste.

Powiedziałbym, że bezpieczniej jest używać mniejszych Regeksów do analizowania tych rzeczy. Przynajmniej w ten sposób, jeśli zachowuje się nienormalnie, nie musisz kopać, aby znaleźć, który konkretny odcinek masywnego Regexa zachowuje się dziwnie. Zapewniając dobre rejestrowanie zamienników, które należy wykonać, byłoby mało prawdopodobne, aby określić źródło problemu, jeśli się pojawi.

Nie chcesz wpaść na this

2

Mówiąc ogólnie, „sekwencyjny” i „równoległy” aplikacji nie jest taka sama i może dawać różne wyniki, ponieważ kolejne zamienniki mogą wpływać na siebie nawzajem.

Co do wydajności, myślę, że jedna ekspresja sprawdzi się lepiej, ale to tylko domysły. Osobiście wolę zachować złożoność i używać trybu "gadatliwego" dla czytelności.

1

Rozumiem twój dodatkowy komentarz dotyczący "jego części spoza HTML, które czyszczę". Z powodu możliwości znalezienia ostatniego RE i zastąpienia treści, które zastąpiła wcześniejsza RE, lepiej byłoby użyć operatora "alternatywnego" i użyć pojedynczego RE.

Należy również rozważyć użycie BeautifulSoup do załadowania i sprawdzenia plików HTML. Pomoże to w znalezieniu odpowiednich fragmentów tekstu przy znacznie mniejszym ryzyku przechwycenia pewnych konstrukcji HTML, kiedy zamierzasz zastąpić jakiś tekst.

Powiązane problemy