2012-06-10 3 views
3

나는 RE에 익숙하지 않지만 목록을 반복하고 re.sub을 사용하여 변수에 들어있는 큰 텍스트 블록에서 여러 항목을 추출하려고합니다. first_word. 찾을 단어 목록을 가진 re.sub

은 내가 먼저 태그를 제거 re.sub를 사용하여이 잘 작동하지만 나는 옆에 exclusionList 변수에 모든 문자열을 제거 할 내가이 작업을 수행하는 방법을 모르겠습니다.

도움을 주셔서 감사합니다. 예외를 제기하는 코드는 다음과 같습니다.

exclusionList = ['+','of','<ET>f.','to','the','<L>L.</L>'] 

for a in range(0, len(exclusionList)): 
     first_word = re.sub(exclusionList[a], '',first_word) 

그리고 예외 :

first_word = re.sub(exclusionList[a], '',first_word) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 151, in sub 
return _compile(pattern, flags).sub(repl, string, count) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 245, in _compile 
raise error, v # invalid expression error: nothing to repeat 
+0

어떤 예외가 발생합니까? – Junuxx

+0

first_word = re.sub (exclusionList [a], '', first_word) 파일 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py "줄 151, 하위 return _compile (pattern, flags) .sub (repl, string, count) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", 줄 245, _compile에 raise 오류, v # 표현이 잘못되었습니다 오류 : 반복 할 항목이 없습니다 –

+1

Junuxx, 도움 감사합니다. 나는 단순히 '\ +'를 exclusionList에 추가했고 이제는 작동합니다. 목록이 정적이기 때문에 이것은 나에게 훌륭한 해결책이다. 도와 주셔서 감사합니다. –

답변

8

플러스 기호 '위의 하나 이상의 반복'정규식 의미 연산자이다. 예 : x+x의 하나 이상의 반복을 의미합니다. 실제 + 표지판을 찾아 교체하려는 경우 re.sub('\+', '', string)과 같이 탈출해야합니다. 그러므로 exclusionList의 첫 번째 항목을 변경하십시오.

또한 이런 for 루프를 제거 할 수

exclusions = '|'.join(exclusionList) 
first_word = re.sub(exclusions, '', first_word) 

파이프 기호 |는 정규식 분리되므로 x|y|z 일치의 X 또는 Y 또는 Z를 나타낸다.

+0

내가 혼란 스러울 지 모르겠다. 그 부분은 작동합니다. 문제가있는 곳을 명확하게하고 예외를 주석으로 포함시키기 위해 코드에서 제거했습니다. 도와 주셔서 감사합니다. –

+0

@EnglishGrad : 아니요, 더하기 기호가 예외의 원인입니다. 're.sub ('+', '', 'foo')'를're.sub ('\ +', '', 'foo')'와 비교하십시오. 첫 번째는 당신이보고있는 예외를 제공하고, 두 번째는 예외를 제공하지 않습니다. – Junuxx

+0

Junuxx, 네가 지금 무슨 말하는지 알 겠어. 도와 주셔서 감사합니다. –

2

프로그램의 기본 형식이 정확하므로 사용중인 정규식과 관련된 모든 문제가 의심됩니다. '+'자체가 유효하지 않은 정규 표현식이므로 '\'를 사용하여 이스케이프해야합니다.

사용 지점에서 파이썬은 문자열에 백 슬래시가 이스케이프 처리되지 않아야하므로 '\'을 의미 할 때 정규 표현식을 '\\'으로 흩 뜨릴 필요가 없도록 지정할 수 있습니다. 이에 대한 구문은 r'\+'에서와 같이 선행 "r"이며, 이는 ExclusionList의 첫 번째 항목을 바꿔야하는 항목입니다.

"to", "the"등의 단어를 추출하려는 경우 단어 전체를 추출하고 실수로 "tooth"에서 "to"를 추출하지 않도록하고 싶습니다. 또는 "기타"의 "the". "\ b"를 추가하여 단어 경계를 지정하면 r'\bto\b'r'\bthe\b'이 표시되지 않습니다.

마지막으로 for a in range(0, len(exclusionList)):은 목록 자체를 반복하면 더 간단하게 작성됩니다 (for exclusion in exclusionList:).

+0

단어 경계에 관한 좋은 지적이지만 루프에 대한 귀하의 제안에 동의하지 않습니다. – Junuxx

+0

'for a range (0, len (seq)) : seq [a]'형식으로 뭔가하는 것은 몇 가지 방법으로 제한됩니다. 'seq'는'len()'과'[]'접근을 지원해야하기 때문에리스트 나 튜플 (set과 dicts는 실패 할 것입니다 -'[]'는 물론 생성자 나 생성자 표현식 - no len). 'range'와'len'이라는 두 함수가 있고, 2.x Pythons에서'range'는 실제로 모든 값을 포함하는 중간 목록 객체를 만듭니다. 목록 인덱스의 범위와 함께 for를 사용하는 것은 C 나 BASIC의 관용구 이월입니다. 반복자는보다 효율적이고 광범위하게 적용 할 수 있습니다. – PaulMcG

+0

그건 사실이지만, 내가 의미하는 바가 아닙니다. 이 경우 for 루프와 그 오버 헤드는 완전히 불필요한 것입니다. – Junuxx

관련 문제