2014-09-12 1 views
0

비 - 공백 문자를 한 번 이상 일치시키는 파이썬 정규 표현식을 설정하려고하는데, 쉼표가 앞에 붙는 한 0 개 이상의 공백 문자가 추가됩니다. 타임스.파이썬 정규 표현식이 작동하기가 어려움

내가 지금까지 사용하려고되었습니다

([+-])(\S(?:,\s*)*)+ 

을 내가 같은 문자열이 있습니다 등 "+foo, bar -baz" or "+foo,bar -baz", 그리고 ("+", "foo,bar")("-", "baz")

+0

I 시도 : 당신이 공백을 보존하기 위해 싶지 않는 경우

>>> import re >>> p = re.compile('([+-])(\w, ]+)') >>> p.findall('+foo, bar -baz') [('+', 'foo, bar '), ('-', 'baz')] >>> p.findall('+foo,bar -baz') [('+', 'foo,bar '), ('-', 'baz')] 

이 시도 ''+ foo, bar -baz ''뿐만 아니라 "+ foo, bar -baz"'등과도 일치 할 수 있기를 원한다. 찾고있는 문자열의 예와 일치시킬 문자열의 예를 들려 줄 수 있습니까? – ashwinjv

+0

그래. –

+0

수정 사항을 추가했습니다. 경기에서 공백을 보존 하시겠습니까? – ashwinjv

답변

1

이 기능이 유용합니까? 이 경우

>>> import re 
>>> p = re.compile('([+-])(\w,]+)') 
>>> tempString = '+foo, bar -baz' 
>>> p.findall(tempString.replace(' ', '')) 
[('+', 'foo,bar'), ('-', 'baz')] 

에서, tempString이 수정되지 않습니다,하지만 당신은 공백을 제거하고 경기를

+0

유일한 문제는 \ w 워드 문자를 엄격하게 전달하지 않는다는 것입니다. –

+0

\ W를 사용하여 다른 문자를 추가하거나 특정 문자를 사용하거나. * 문자를 사용할 수 있습니다. . * (모두 일치)입니까? (덜 탐욕스러운) – ashwinjv

0

어떤 일치하도록 그룹과 두 경기를 얻으려면 뒤에 공백 문자의 수 :

[^\s]+, 

T 코드에서 암탉 당신은 쓸 수 :

>>> import re 
>>> p = re.compile(r'[^\s]+,', re.MULTILINE) 
>>> s = "+foo, bar -baz" 
>>> [x.replace(',', '') for x in p.findall(s)] 
['+foo'] 
0

잘 모르겠어요,하지만 난 당신을 위해 무엇을 찾고있는 것은이 생각 :

>>> regex = r"([+-])(\S+,\s*\S*|\S+$)" 
>>> re.findall(regex, "+foo, bar -baz") 
[('+', 'foo, bar'), ('-', 'baz')] 

>>> re.findall(regex, "+foo,bar -baz") 
[('+', 'foo,bar'), ('-', 'baz')] 
: 여기
p = re.compile(r'^[+-]?[^\s,]+(?:, ?[+-]?[^\s,]+)*$') 
+0

닫기지만 아주. 어쩌면 지금 내가 뭘하려고하는지 이해할 수 있을지에 대한 질문을 편집 한 것일까 요? –

+0

@ G.Chi : 귀하의 요구 사항은 항상 분명하지 않습니다. 무엇을 반환해야합니까 :'foo, bar, baz'? –

+0

re.findall은'("+", "foo, bar") 및 ("-", "baz") 그룹의 두 일치를 반환해야합니다. –

1

내 시도이다

문자열 끝에 -baz을 대응시키기 위해 이후에 일치를 | 인 두 개의 개별 사례로 분할하는 것이 쉬웠습니다.

편집 : 쉼표가 항상있는 것은 아니지만 정규 표현식 r"([+-])(\S+(?:,\s*\S*)|\S+$)"이 더 적합 할 수 있습니다.

+0

위대한 시도이지만 항상 쉼표가 반드시 필요하지는 않습니다. 허용 목록/차단 목록에 항목을 추가하고 제거하는 명령을 구문 분석하는 데 사용하려고합니다. –

+0

아 OK. 'r '([+ -]) (\ S + (? :, \ s * \ S *) | \ S + $) 그렇지 않은 경우 몇 가지 예가 솔루션에 더 가까워 질 수 있습니다. –

+0

이것은 단지 두 그룹의 항목 과 일치하는 것으로 보입니다. 그러나 이것과 @Ashwin의 답을 조합하여 해결책을 찾을 수있었습니다. 감사! –