2010-07-23 5 views
3

는 파이썬에서 텍스트 문자열을 감안할 때 : 나는 3 번 이상 발생하는 모든 알파벳이 아닌 문자를 대체 할 방법어떻게하면 파이썬에서 regex를 바꿀 수 있습니까?

s = "(((((hi abc)))))))" 
s = "***(((((hi abc ***&&&&" 

... 빈 문자열

으로 위의 모든 결과를 들어 해야한다 :

hi abc 
+0

입력이''(& * hello! @ # '' '? –

+0

"빈 문자열"이란 무엇입니까? –

답변

8

이 작동합니다 : \W{3,}을 :

: 3 인 이상 번 발생하는 비 알파벳과 숫자 일치
>>> s = "***(((((hi abc ***&&&&" 
>>> re.sub("\W{3,}", "", s) 
'hi abc' 
>>> s = "(((((hi abc)))))))" 
>>> re.sub("\W{3,}", "", s) 
'hi abc' 
+0

"3 이상"! = "3 이상" –

+1

@John : 정확함. 예제에는 '***'가 포함되어 있으므로 3+가 필요하다고 생각했습니다. .. 나는이 해결책이 주어진다면, 그는 확신 할 수 있었다. 하나 추가하는 방법을 알아 내. (그 이유는 내가 이탤릭체로 된 _3 이상) – Stephen

4

비 공백 문자가 아닌 알파벳 순서 (예 :. '!?&'), @ Stephen의 대답은 괜찮습니다. 만 세 개 이상의 동일한 비 alphamerics하는 역 참조의 순서를 바꾸려면 그러나 도움이 될 것입니다 :

>>> r3 = re.compile(r'(([^\s\w])\2{2,})') 
>>> r3.findall('&&&xxx!&?yyy*****') 
[('&&&', '&'), ('*****', '*')] 

따라서, 예를 들어 : 당신은 할 수 없습니다

>>> r3.sub('', '&&&xxx!&?yyy*****') 
'xxx!&?yyy' 
+0

"3 이상"! = "3 이상" –

+0

+1, 내 대답에 대한 역 참조를 추가하기 위해 돌아왔다. 그러나 나는 그것을 가질 것이다. :) – Stephen

+0

@ 존, 그래,하지만 @Stephen은 이미 설명했듯이, OP가 원하는 행동에 대한 그의 모범에서 총체적으로 파문을 일으키기보다는 영어로 약간의 실수를 범했다고 더 믿을만하다. –

0

을 (쉽게, regexes를 사용하여) 대체 된 텍스트와 길이가 같은 "빈 문자열"로 바꿉니다. 빈 문자열 "" 또는 단일 공 간 " " 또는 원하는 상수 문자열로 바꿀 수 있습니다. 예에서 "*"을 사용 했으므로 어떤 일이 발생했는지 쉽게 알 수 있습니다.

>>> re.sub(r"(\W)\1{3,}", "*", "12345<><>aaaaa%%%11111<<<<..>>>>") 
'12345<><>aaaaa%%%11111*..*' 
>>> 

참고주의 :은 내가 "3 회 이상 발생하는 알파벳이 아닌 문자는"같은 기호가 발생하는 것을 의미 있으리라 믿고있어 ... "<> <>"변경되지 않습니다 3 번 이상 "이라고 가정합니다."3 이상 "이 아니라"3 이상 "을 의미한다고 가정합니다.

관련 문제