2014-07-11 126 views
0

如何刪除撇號,雙引號,逗號等所有單詞,不包括像它是什麼,什麼是等字。句子中必須有句號和句號之間的空格。如何不刪除撇號文本文件中的某些單詞的撇號

例如

輸入句子:

"'This has punctuation, and it's hard to remove. ?"  

所需的輸出句子:

This has punctuation and it's hard to remove . 
+0

請問您能否提供更多的例子並且更清楚地定義'etc'? – Jerry

+0

如果我有像下面的例子這樣的句子,我想刪除所有標點符號,除了這樣的單詞之外,單詞和句尾之間有什麼和需要空格。 INPUT File:「'我從Best Buy購買了30美元這是什麼 什麼是浪費金錢!耳朵凝膠首先是舒適的,但一小時後會怎麼樣 期望的輸出:我從百思買買了它30 浪費金錢耳朵凝膠起初很舒服,但是一小時後會怎麼樣 – user3232688

+0

你可以把它放在你的問題中,並適當地設置它的格式嗎?有些邊緣情況你可能沒有考慮過:如果你有'你有沒有見Cress的髮型嗎?「這個'東西'有一個非常不好的習慣,你知道嗎?'那些成爲什麼? – Jerry

回答

1

我提出這樣的代碼:

import re 

sentences = [""""'This has punctuation, and it's hard to remove. ?" """, 
      "Did you see Cress' haircut?.", 
      "This 'thing' hasn't a really bad habit, you know?.", 
      "'I bought this for $30 from Best Buy it's. What a waste of money! The ear gels are 'comfortable at first, but what's after an hour."] 

for s in sentences: 
    # Remove the specified characters 
    new_s = re.sub(r"""["?,$!]|'(?!(?<! ')[ts])""", "", s) 

    # Deal with the final dot 
    new_s = re.sub(r"\.", " .", new_s) 
    print(new_s) 

ideone demo

輸出:

This has punctuation and it's hard to remove . 
Did you see Cress haircut . 
This thing hasn't a really bad habit you know . 
I bought this for 30 from Best Buy it's . What a waste of money The ear gels are comfortable at first but what's after an hour . 

正則表達式:

["?,$!]  # Match " ? , $ or ! 
|   # OR 
'   # A ' if it does not have... 
(?!   
    (?<! ') 
    [ts]  # t or s after it, provided it has no ` '` before the t or s 
) 
+0

謝謝@傑裏,但如何刪除撇號下面的話Cress'= Cress – user3232688

+0

@ user3232688哦,哎呀。不知何故,我認爲它應該保持。給我幾分鐘來解決這個問題。好的,改變了。 – Jerry

+0

非常感謝你@Jerry – user3232688

0

使用用於外部引號

像這樣string.strip(定界符)函數:

output = chaine.strip("\"") 

請注意,您必須使用'\'(如',',\,等等)來轉義某些字符。或者你可以輸入他們爲''「,'''(不確定)。

編輯:mmh,沒有考慮撇號,如果唯一的問題是撇號,你可以先解開它,然後手動解析它用for語句,找到找到的第一個撇號的指示符,然後如果後跟一個's',就把它留下,我不知道,你必須在編碼之前設置詞彙/語義規則。

編輯2: 如果該字符串只是一個句子,總是在最後一個點,總是需要的空間,然後在最後使用:

chaine[:-2]+" "+chaine[-2:] 
+0

'strip'只能用於去除前導和尾隨字符。 – timgeb

+0

編輯我的答案,但不知道引號是否是輸入的一部分,我認爲是這樣,因爲他們沒有在期望的輸出。 – PhilDenfer

2

使用負查找behin d

(?<!\w)["'?]|,(?=) 

除去匹配'"?字符通過re.sub

DEMO

而且你的代碼會是這樣,

>>> s = '\"\'This has punctuation, and it\'s hard to remove. ?\" ' 
>>> m = re.sub(r'(?<!\w)[\"\'\?]|,(?=)', r'', s) 
>>> m 
"This has punctuation and it's hard to remove. " 
+1

逗號缺失。 '''''''第二個撇號不會包含在正則表達式中 – Braj

+0

@Braj我認爲現在沒關係 –

+0

這會使'?'成爲'OK'嗎?(例如,它也會將逗號留在'汽車,'等),不知道這是否正常與OP? – zx81

0

使用此:

(?<![tT](?=.[sS]))["'?:;,.] 

如果你也想在一行的末尾離開期間(只要它前面有一個空格):

(?<![tT](?=.[sS]))(?<! (?=.$))["'?:;,.] 
+0

僅供參考,它是正確的比它聽起來有點複雜,這就是爲什麼我的正則表達式更長一點。增加了第二個版本,離開了(如果前面有一個空格) – zx81

0

我想這是,刪除所有在任何一個單詞結尾的引文。因此從單詞分割句子字(由白色空間隔開)並去掉任何前導或尾隨引號

>>> ''.join(e.strip(string.punctuation) for e in re.split("(\s)",st)) 
"This has punctuation and it's hard to remove " 
+0

仍然有'標點符號',OP想要刪除',' –

+0

@PadraicCunningham:我最初展示了這個方法,你想要剝離什麼,你需要添加一個明確的列表,在這個特定的情況下,我已經包含'string.punctuation' – Abhijit

+0

@Ahhijit如何保持文件末尾的單詞和句點之間的空格,並且可以讓我知道輸入句子是否類似下面。「'我買了這個從Best Buy購買30美元。多浪費錢!耳朵一開始很舒服,但一小時後會怎樣?所需的輸出必須如下:我從百思買那裏購買了30張。 浪費金錢耳朵一開始很舒服,但一小時左右後,耳朵開始真的受到傷害。 – user3232688