2011-10-13 3 views
34

Python 2.7.2에서 regex를 사용하여 문자열에서 태그가있는 단어를 모두 추출하려고합니다. 또는 단순히 [p][/p] 태그 안에있는 모든 텍스트를 추출하고 싶습니다. ['[P] Barack Obama [/P]', '[P] Bill Gates [/p]'] 또는 ['Barrack Obama', 'Bill Gates']를 : 얻을 수있는 올바른 정규식이 무엇 person['President [P]', '[/P]', '[P] Bill Gates [/P]']Python regex findall

을 생산

regex = ur"[\u005B1P\u005D.+?\u005B\u002FP\u005D]+?" 
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday." 
person = re.findall(pattern, line) 

인쇄 : 여기 내 시도이다.

감사합니다. :)

답변

54
import re 
regex = ur"\[P\] (.+?) \[/P\]+?" 
line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday." 
person = re.findall(regex, line) 
print(person) 

['Barack Obama', 'Bill Gates'] 

정규식 ur"[\u005B1P\u005D.+?\u005B\u002FP\u005D]+?" 정확하게 판독 어려워 제외 u'[[1P].+?[/P]]+?' 같은 유니 코드 산출한다.

첫 번째 괄호 그룹 [[1P] 목록 ['[', '1', 'P']의 문자 중 하나가 일치해야 re를 알려줍니다, 마찬가지로 두 번째 괄호 그룹 [/P]]와 저놈은 전혀 원하는 아니다. 따라서

  • 외부 묶음 대괄호를 제거하십시오. (또한 P 앞에 1 미광을 제거한다.)
  • [P]
  • 는 상기 리터럴 브래킷을 보호하기 위해, 백 슬래시 브래킷 탈출 : \[P\]한다.
  • 태그 안의 단어 만 반환하려면 그룹화 괄호 을 .+?에 두십시오.
10

이 시도 :

for match in re.finditer(r"\[P[^\]]*\](.*?)\[/P\]", subject): 
     # match start: match.start() 
     # match end (exclusive): match.end() 
     # matched text: match.group() 
+0

정말이 답변있다. 일치 항목 만 처리하려는 경우 1) 목록 저장, 2) 목록 처리는 str = 'purple [email protected], blah monkey [email protected]과 동일하지 않습니다. blach dishwasher ' ## re.findall()은 발견 된 모든 전자 메일 문자열의 목록을 반환합니다. emails = re.findall (r'[\ w \ .-] + @ [\ w \ .-] + ' str) ## [ '[email protected]', 'bob @ abc.com]] 이메일에 대한 이메일 : # 각각의 이메일 문자열에서 뭔가를 수행하십시오. 인쇄 이메일 – kkron

3

귀하의 질문은 100 % 명확하지 않다,하지만 난 믿고있어 당신이 [P][/P] 태그 내부에 텍스트의 모든 조각을 찾으려면 :

>>> import re 
>>> line = "President [P] Barack Obama [/P] met Microsoft founder [P] Bill Gates [/P], yesterday." 
>>> re.findall('\[P\]\s?(.+?)\s?\[\/P\]', line) 
['Barack Obama', 'Bill Gates'] 
1

당신이 할 수있는 패턴 바꾸기

regex = ur"\[P\]([\w\s]+)\[\/P\]" 
+0

서식을 잘 살펴보십시오. * 미리보기 영역 * 사용. 당신이 제대로 포맷하지 않았기 때문에, 백 슬래시는 guzzled되었다 (markdown은 그렇게 가난하다). –

+0

왜 그가 사용했던'. *? '대신'[\ w \ s] +'를합니까? ". *?"는 그가 원하는 것일 확률이 더 높습니다. '[\ w \ s]'는 엄청나게 제한적입니다. –

+0

의도적 인 제한. 나는 asker가 거의 숫자를 포함하지 않는 이름을 추출하기를 원하기 때문에 [\ w \ s] +를 사용합니다. 또한 묻는 사람은 숫자가 아닌 단어를 추출하기를 원했습니다. 그래도 내 생각은, cmiiw – pram

1

패턴,

pattern = '\[P\].+?\[\/P\]'

확인 here