2013-08-06 2 views
1

데이터 묶음이있는 "비트"라는 2 차원 배열이 있습니다. 배열의 두 번째 열에는 알파벳 순서로 단어 목록이 있습니다.파이썬에서 두 문자열을 비교할 때 구두점 및 대소 문자를 무시합니다.

"단어"라는 문장이 있는데 원래는 문자열 이었기 때문에 배열로 바뀌 었습니다.

"words"의 단어 중 하나가 "beats"배열의 두 번째 열에있는 단어 중 하나와 일치하는지 확인해야합니다. 일치하는 단어가 발견되면 프로그램은 일치 단어를 "words"문장에서 "match"로 변경 한 다음 단어를 문자열로 반환합니다.

"Money is the last money." 

그리고 "돈"배열 "친다"의 두 번째 열에있는 결과가 될 것이다 : 나는 문장이 있다면 그래서

i = 0 
while i < len(words): 
    n = 0 
    while n < len(beats): 
     if words[i] == beats[n][1]: 
      words[i] = "match" 
     n = n + 1 
    i = i + 1 
mystring = ' '.join(words) 
return mystring 

: 이것은 내가 사용하고 코드입니다 :

"match is the last match." 

"일치"뒤에 마침표가 있기 때문에 일치하는 것으로 간주하지 않습니다.

두 문자열을 비교할 때 구두점을 무시할 수있는 방법이 있습니까? 프로그램에서 성냥 교체를 마친 후에 문장 부호를 원한다면 구두점을 사용하고 싶기 때문에 구두점을 제거하고 싶지 않습니다.

+0

는'단어 = "일치"'해야하지 '단어를 [내가] =이'를 "일치"? 문자열'match '로'words' 배열을 덮어 쓰는 것 같습니다. – Nadh

+0

내가 잘못 입력 했어, 그게 다야, 고마워, 내가 바꿀거야. – eltb

답변

1

원하는 속성을 가진 새 문자열을 만든 다음 새 문자열과 비교할 수 있습니다. 이렇게하면 숫자, 문자 및 공백 이외의 모든 문자가 제거되고 모든 문자는 소문자가됩니다.

match is the last match. 
+0

나는 기존의 대문자를 그대로 유지하고 모든 쉼표를 그대로 유지하고자합니다. – eltb

+0

비교를 위해 또는 출력 문자열에 대해? 목록 이해력을하면 * 무엇을 값으로 변경하지 않을 것입니다. – mr2ert

+0

예를 들어, "Hey, my name is bob"이면 2-D 배열은 [ "Hey,", "my", "name", "is", "bob"]가됩니다. 3 차원 배열에 "name"이라는 단어가 있으면 "이름,"이 (가) 반환하지 않기 때문에 "Hey, my match is bob"이 반환되지 않습니다. 일치하는 "이름". 문자열을 비교할 때만 구두점을 무시하고 싶습니다. – eltb

1

:

''.join([letter.lower() for letter in ' '.join(words) if letter.isalnum() or letter == ' ']) 

당신이 뭔가를 할 수있는 문자열에서 문자를 제외한 모든를 제거하려면 당신이 걱정하는 것이 전부입니다. 에드에 대해서, 그렇다면 당신은 그것과 일치하는 또 다른 경우를 추가 할 수 있습니다. 케이스가 제한적일 경우 유사 처리를 추가 할 수 있습니다. 그렇지 않으면 regex가 갈 길입니다.

words="Money is the last money. This money is another money." 
    words = words.split() 
    i = 0 
    while i < len(words): 
    if (words[i].lower() == "money".lower()): 
     words[i] = "match" 
    if (words[i].lower() == "money".lower() + '.'): 
     words[i] = "match." 
    i = i + 1 

    mystring = ' '.join(words) 
    print mystring 

출력 :

match is the last match. This match is another match. 
+0

"word == '는'matches ': continue라는 단어는'match '라는 단어를 검색하지 않으므로 무슨 뜻입니까? 그것이 효과가 있기 때문에 나는 단지 호기심을 가지고있다. 그러나 나는 그것을 얻지 않는다. – eltb

+0

이것은 비록 3 차원 배열로 작동하지 않는 것 같습니다. – eltb

+0

이것은 단지 데모입니다. 예를 충분하게 제공하지 않았으므로이를 데이터 구조에 적용해야합니다. – dawg

0

하면

import re 

st="Money is the last money." 

words=st.split() 
beats=['money','nonsense'] 

for i,word in enumerate(words): 
    if word=='match': continue 
    for tgt in beats: 
     word=re.sub(r'\b{}\b'.format(tgt),'match',word,flags=re.I) 
     words[i]=word 

print print ' '.join(words)  

인쇄 : 당신은 정규식을 사용할 수

from string import ascii_letters 
''.join([letter for letter in word if letter in ascii_letters]) 
+0

답변 주셔서 감사합니다, 정규식 확실히 방법이 될 것으로 보인다. – eltb

관련 문제