2017-02-24 16 views
1

でリストを期待される出力を返さないが、私はPizza_BurgerWorld_kingとリストで(-/で)アイテムを交換しようとしていますa = ['Aeroplane','Ramanujan','World-king','Pizza/Burger'] です。記号が何であっても、置き換えてアンダースコアにする必要があります。正規表現のpython

は、ここに私のコードです:

import re 
def replaceStrings(arg): 
    txt =arg 
    res = re.search(r'(?i)\b([a-z][a-z0-9_]*)([/-]+)([a-z][a-z0-9_]*)\b', txt) 
    if res: 
     pp = reg.sub(r'\1_\2',txt) 
     print(pp) 
     return pp 



for i in a: 
    replaceStrings(i) 

しかし、私は所望の出力を得ていないのです。私の正規表現で何が間違っています。 私は正規表現の初心者です。ありがとうございます

+0

をあなたがサブを行う、検索する必要がいけません直接 – Nullman

+0

@ヌルマン私は理解しています。しかし、私は10,000アイテムのリストを持っています。彼らはこのような文字列を含んでいます。ありがとうございました。 –

+0

私の正規表現を確認できますか?私はどこか少し間違いを犯したと思う。 –

答えて

5

用語をクリーンアップする簡単な方法は、用語をループして各用語を別々にクリーンアップすることです。あなただけのような単純なもののために行くことができ'World-king'.replace('/','_').replace('-','_')

それとも、このように清掃するための正規表現を使用することができます。

import re 
def replaceStrings(arg): 
    # each individual special character you want to clean can be put in the brackets `[]` 
    pp = re.sub(r'[-/]', '_', arg) 
    print(pp) 
    return pp 


a = ['Aeroplane','Ramanujan','World-king','Pizza/Burger'] 
for i in a: 
    replaceStrings(i) 

出力:

Aeroplane 
Ramanujan 
World_king 
Pizza_Burger 

更新:[OPで追加したコメント]

私は必要なパターンの文字列を持っていることを確認する予防措置を講じました。私の質問は、それは良い練習ですか?私は の代わりに直接余分なステップを書いたのですか?

あなたはパターンがそれをクリーニングする前に一致していることを確認したい場合は、も行うことができます。

import re 

pattern = re.compile(r'(?i)\b([a-z][a-z0-9_]*)([/-]+)([a-z][a-z0-9_]*)\b') 

def replaceStrings(arg): 
    if pattern.match(arg): 
     pp = re.sub(r'[-/]','_', arg) 
     print(pp) 
     return pp 

a = ['Aeroplane','Ramanujan','World-king','Pizza/Burger'] 
for i in a: 
    replaceStrings(i) 

出力:

World_king 
Pizza_Burger 
+0

私は必要なパターンの文字列を持っていることを確認する予防措置を取った。私の質問は、それは良い練習なのですか?私は直接re.subをやっているのではなく、余計なステップを書いたのですか?ありがとうございます –

+0

素晴らしい!ありがとうございました。今ははっきりと簡潔です。私は違いがあります。 –

+0

@BhabaniMohapatraあなたが探しているパターンはかなり複雑に思えます。あなたが探しているものが正確に何であるか教えていただけたら、それを単純化することができます。 –