2015-12-16 9 views
6
import re 

s = 'PythonCookbookListOfContents' 

# the first line does not work 
print re.split('(?<=[a-z])(?=[A-Z])', s) 

# second line works well 
print re.sub('(?<=[a-z])(?=[A-Z])', ' ', s) 

# it should be ['Python', 'Cookbook', 'List', 'Of', 'Contents'] 

Jak podzielić ciąg znaków od granicy małej litery i dużej litery za pomocą języka Python?Python re nie może podzielić kotwicy o zerowej szerokości?

Dlaczego pierwsza linia nie działa, gdy druga linia działa dobrze?

Odpowiedz

8

Według re.split:

Należy pamiętać, że nigdy nie będzie podzielone podzielić ciąg na pusty wzór meczu. Na przykład:

>>> re.split('x*', 'foo') 
['foo'] 
>>> re.split("(?m)^$", "foo\n\nbar\n") 
['foo\n\nbar\n'] 

Jak na temat korzystania re.findall zamiast? (Zamiast skupiać się na separatory, koncentrują się na pozycji, którą chcesz uzyskać.)

>>> import re 
>>> s = 'PythonCookbookListOfContents' 
>>> re.findall('[A-Z][a-z]+', s) 
['Python', 'Cookbook', 'List', 'Of', 'Contents'] 

UPDATE

Korzystanie regex module (Alternative regularne moduł ekspresyjny, aby zastąpić re), można podzielić na zerowej szerokości mecz:

>>> import regex 
>>> s = 'PythonCookbookListOfContents' 
>>> regex.split('(?<=[a-z])(?=[A-Z])', s, flags=regex.VERSION1) 
['Python', 'Cookbook', 'List', 'Of', 'Contents'] 

UWAGA: Określ regex.VERSION1 flagę aby umożliwić sp zachowanie oparte na zasadzie "zero na długości".

+0

Oczywiście mogę używać findall, aby znaleźć słowa, ale jak podzielić je według granicy małych i wielkich liter? Musisz poradzić sobie z tym pytaniem pewnego dnia, kiedy sytuacja się zmieniła i musisz użyć kotwic o zerowej szerokości, aby dopasować granice. – Booster

+0

Przez kotwicę rozumiesz tablicę? – Onilol

+0

Mam na myśli patrzeć w przyszłość i patrzeć za siebie, a mianowicie "? <=" I "? =". @Onilol – Booster

Powiązane problemy