2015-10-13 9 views
6

正規表現を使用して、文字の間に現れるダッシュをスペースで置き換えたいと考えています。例えば、ab-cdab cdと置き換えます。正規表現を使用して文字間のダッシュをスペースで置き換える方法

以下は、文字文字列に一致します。私が望むようab-cda dでの結果ではなく、ab cd]は

new_term = re.sub(r"[A-z]\-[A-z]", " ", original_term) 

にはどうすればいいだけ-部品を交換するために、上記の適応しますか?キャプチャグループへ

+0

のCaあなたは '-'を指定された文字列のスペースで置き換えるだけでこれを行います。正規表現を使用する必要がありますか? –

+1

@JeffBridgmanはい - ダッシュが文字の間にあるときだけ置き換えます。空白の間では置き換えません。すなわち 'ab-cd'を置き換えるが、' ab-cd'は変更しない - [replace'はその制御を持たない]。 – kyrenia

答えて

6

あなたがグループに後の文字前をキャプチャする-を必要とし、交換のためにそれらを使用する、すなわち、:

import re 
subject = "ab-cd" 
subject = re.sub(r"([a-z])\-([a-z])", r"\1 \2", subject , 0, re.IGNORECASE) 
print subject 
#ab cd 

DEMO

http://ideone.com/LAYQWT


REGEXの説明】

([A-z])\-([A-z]) 

Match the regex below and capture its match into backreference number 1 «([A-z])» 
    Match a single character in the range between “A” and “z” «[A-z]» 
Match the character “-” literally «\-» 
Match the regex below and capture its match into backreference number 2 «([A-z])» 
    Match a single character in the range between “A” and “z” «[A-z]» 

\1 \2 

Insert the text that was last matched by capturing group number 1 «\1» 
Insert the character “ ” literally « » 
Insert the text that was last matched by capturing group number 2 «\2» 
6

使用参照:

>>> original_term = 'ab-cd' 
>>> re.sub(r"([A-z])\-([A-z])", r"\1 \2", original_term) 
'ab cd' 

これは、あなただけの何らかの理由でoriginal_term.replace('-', ' ')を行うことができないことを、もちろん、前提としています。恐らく、あなたのテキストは、ハイフンを使用して、enダッシュや何かを使用すべきです。

+0

regexの範囲はASCIIテーブルインデックスを使用するため、 '[A-z]'は使用しないでください。この特定の範囲では、 'A-Z [\]^_ \' a-z'にマッチします。しかし、 'a-z'をキーに使用したい場合は、'(?i) 'を使うことができます。たとえば、 '(?i)([a-z])\ - ([a-z])'を使うことができます。とにかく、私はOP独自の正規表現を知っている...しかし、ただのことだ。 –

1

あなたはルックアラウンドを使用する必要があります。

new_term = re.sub(r"(?i)(?<=[A-Z])-(?=[A-Z])", " ", original_term) 

またはグループをキャプチャ:

new_term = re.sub(r"(?i)([A-Z])-([A-Z])", r"\1 \2", original_term) 

[A-z]はまた、いくつかの非文字(すなわち[\と一致していることをIDEONE demo

ノートを参照してください。 、],^,_および`)、それを[A-Z]に置き換え、大文字小文字を区別しない修飾子(?i)を使用することをお勧めします。

文字クラスの外にハイフンをエスケープする必要はありません。

2

re.sub()は、常に置換された配列全体を置き換えます。

だけダッシュを交換する解決策は先読み戻り読み表明しています。一致したシーケンスにはカウントされません。

new_term = re.sub(r"(?<=[A-z])\-(?=[A-z])", " ", original_term) 

構文はPython documentation for the re moduleで説明されています。

関連する問題