正则表达式没有在python中返回预期的输出

Wat*_*236 1 python regex regex-greedy

名单a = ['Aeroplane','Ramanujan','World-king','Pizza/Burger'] 我想替换的项目(有-,/与列表中)Pizza_BurgerWorld_king.无论符号是什么,都应该用下划线代替.

这是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

但我没有得到所需的输出.我的正则表达式有什么问题.我是正则表达式的初学者.谢谢

Vik*_*ngh 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)
Run Code Online (Sandbox Code Playgroud)

输出:

Aeroplane
Ramanujan
World_king
Pizza_Burger
Run Code Online (Sandbox Code Playgroud)

更新:[评论由OP添加]

我采取了预防措施,确保我拥有所需模式的字符串.我的问题是,这是一个好的做法我写了一个额外的步骤,而不是直接做re.sub?

如果您想在清洁之前确保图案匹配,那么也可以这样做:

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)
Run Code Online (Sandbox Code Playgroud)

输出:

World_king
Pizza_Burger
Run Code Online (Sandbox Code Playgroud)