2009-08-14 75 views
1

我想刪除首字母縮寫詞中的點,但不要刪除python字符串中的域名。例如, 我希望字符串刪除首字母縮寫詞的正則表達式的正則表達式是什麼?

'a.b.c. [email protected] http://www.test.com' 

成爲

'abc [email protected] http://www.test.com' 

我做的最接近的正則表達式到目前爲止

re.sub('(?:\s|\A).{1}\.',lambda s: s.group()[0:2], s) 

其結果

'ab.c. [email protected] http://www.test.com' 

它似乎f或上述正則表達式來工作,我需要正則表達式更改爲

(?:\s|\A|\G).{1}\. 

但不存在匹配標記(\ G)在Python結束。

編輯:正如我在我的評論中提到的,字符串沒有特定的格式。這些字符串包含非正式的人類對話,因此可能包含零個,一個或幾個縮略詞或域名。如果能夠讓我免於編碼一個「真正的」解析器,那麼我的一些錯誤就沒有問題了。

+4

恕我直言,一個正則表達式是不您的問題的正確工具。這可能是可能的,但會導致代碼過於複雜。我會採用更傳統的方法,並使用混合正則表達式和Python代碼將字符串拆分爲其組件(普通文本,縮略詞,...),並單獨處理這些部分。更詳細但也更易於維護。 – sebasgo 2009-08-14 17:36:39

+0

我可能應該提到我將它用作一系列其他正則表達式的一部分,用於規範表示非正式人類對話的字符串序列。我可以容忍一些錯誤,如果這會讓我無法進行更徹底的解析。 – ianalis 2009-08-14 21:27:52

+1

您需要更好地指定問題。你的數據總是在三個空間分開的部分,你只想影響第一部分?或者您是否需要將此應用於任意文本?如果後者,你會如何定義一個首字母縮略詞?只有單個字母?如果是這樣,那麼您期望http://a.b.example.com會發生什麼?或者,除非你知道它是域名的一部分,否則你想刪除嵌入的時段?但是,這隻會引出一個問題:它是什麼時候成爲域名的一部分:After @ or http://?那麼ssh:或其他URL方案呢?一旦定義,任何這些將是一個簡單的正則表達式。 – MtnViewMark 2009-08-14 21:46:07

回答

1

對我下面的工作(與感謝Bart他的回答):

re.sub('\.(?!(\S[^. ])|\d)', '', s) 

如果是在一個單詞或縮寫的第一個字符這不會刪除一個點。

2

我建議你在'@'(或任何有意義的字符)處拆分字符串,在第一部分進行替換,然後將字符串放回到一起。我認爲這會比複雜的正則表達式更好地展現代碼的意圖。事情是這樣的,也許:

string='a.b.c. [email protected] http://www.test.com' 
left, rest = string.split("@",1) 
left = left.replace(".","") 
result="%[email protected]%s" % (left, rest) 
2

你可以簡單地刪除沒有這兩個[AZ]字母(或更多)DOTS在他們前面:

\.(?![a-zA-Z]{2}) 

但是,當然,這也將刪除第一個點從以下地址:

[email protected]

你可以解決這個問題做:

\.(?![a-zA-Z]{2}|[^\[email protected]]*[email protected]) 

但我相信會有更多這樣的角落案例。

+0

感謝您的建議。這是我答案的基礎。它確實出現在我的腦海之中,但我錯誤地不去追求它。 – ianalis 2009-08-14 21:39:45

5

如果您的數據總是像這樣格式化,那麼爲什麼不通過分割空間將數據分成3部分。

然後,從第一個元素中刪除句號並使用連接重新合併部分是非常簡單的。

+1

它並不總是像這樣格式化。我將在我新增加的評論中提到的非正式人類對話中使用它。 – ianalis 2009-08-14 21:29:58

0

不優雅的簡單re.sub(),但試試這個:

import re 

s='a.b.c. [email protected] http://www.test.com' 
m=re.search('(.*?)(([a-zA-Z]\.){2,})(.*)', s) 

if m: 
    replacement=''.join(m.group(2).split('.')) 
    s=m.group(1)+replacement+m.group(4) 

print s 

它假定有每串不超過一個縮寫,但你總是反覆運行它。

1

非正則表達式的方法:

>>> S = 'a.b.c. [email protected] http://www.test.com' 
>>> ' '.join(w if '@' in w or ':' in w else w.replace('.', '') for w in S.split()) 
'abc [email protected] http://www.test.com' 

(需要空間分割上,雖然 - 所以,如果你有這樣的事情逗號,沒有空格,則可能會錯過一些。)

相關問題