2009-08-14 7 views
1

頭字語のドットは削除したいが、python文字列のドメイン名は削除したくない。例えば、 は、私は、文字列頭字語でドットを削除する正規表現はありますが、ドメイン名では使用できません。

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

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

私がこれまでに作られた最も近い正規表現は

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

それに起因

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

あるになりたいですそうだね上記の正規表現が動作するか、私は

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

に正規表現を変更する必要がありますが、Pythonで一致マーカー(\ G)の終わりはありません。

編集:私のコメントで述べたように、文字列には特定の書式がありません。これらの文字列には、非公式の人間の会話が含まれているため、0個、1個または複数の頭字語またはドメイン名を含むことがあります。私が "本当の"パーサーをコーディングするのを救うことができれば、いくつかのエラーは私にはうまくいきます。

+4

私見正規表現ではありませんあなたの問題に適したツール。それは可能かもしれないが、過度に複雑なコードにつながる。より伝統的なアプローチを採用し、文字列をコンポーネント(通常のテキスト、頭字語など)に分割し、部分を個別に処理するために、正規表現とPythonコードを組み合わせて使用​​します。より冗長で、より保守的です。 – sebasgo

+0

私は、非公式の人間の会話を表す一連の文字列を正規化するために、これを一連の他の正規表現の一部として使用していると述べているはずです。もし私がより徹底した解析をするのを救えるならば、私はいくつかのエラーを許容することができます。 – ianalis

+1

問題をよりよく指定する必要があります。あなたのデータは常に3つの区切りの部分に分かれていて、最初の部分だけに影響を与えたいですか?あるいはこれを任意のテキストに適用する必要がありますか?後者の場合、どのように略語を定義しますか?一文字だけ?もしそうなら、http://a.b.example.comで何が起こると思いますか?または、それがドメイン名の一部であることを知っている場合を除いて、埋め込み期間を削除したいのですか?しかし、それは疑問を招くだけです:それはドメイン名の一部です:@またはhttp://の後? ssh:または他のURLスキームはどうですか?いったん定義されると、これらのどれでも簡単な正規表現になります。 – MtnViewMark

答えて

1

(彼の答えのためにバートのおかげで)私のために働い以下:それは単語や頭字語の最初の文字である場合

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
あなたは、単にそれらの2つ先の[AZ]の文字(またはそれ以上)を持っていませんDOTSを削除することができ

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

しかし、もちろんのこと意志も削除以下のアドレスからの最初のDOT:

[email protected]

次の操作を行うことにより、これを修正できます。

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

しかし、私はこのようなコーナーケースがさらに多くなると確信しています。

+0

この提案をありがとう。これが私の答えの基礎でした。それは私の心に前に来たが、私はそれを追求しないと誤解している。 – ianalis

5

データが常にこのようにフォーマットされている場合、スペースを分割してデータを3つに分割しないでください。

その後、最初の要素からピリオドを削除し、結合を使用して部品を再作成するのは簡単です。シンプルre.sub()として

+1

このように常にフォーマットされているとは限りません。私は、新しく追加されたコメントで述べたように、非公式の人間の会話にそれを使用します。 – ianalis

0

としてエレガントされないが、これを試してみてください。

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つ以下の頭字語がないことを前提としていますが、あなたは常にそれを繰り返し実行することができます。

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' 

は(ただし、上分割するスペースが必要です - ので、あなたは、スペースなしでコンマのようなものを持っていた場合には、いくつかを逃すことができます。)

関連する問題