代码之家  ›  专栏  ›  技术社区  ›  Mornor

Python-sed正则表达式匹配

  •  1
  • Mornor  · 技术社区  · 6 年前

    我想用 re.sub() 在我的python脚本中删除一些字符串。

    这个 sed 我使用的命令是(在Linux上):

    echo "helloworld-5b5cf484-g582f" | sed 's/-[a-z0-9]\{5\}$//' | sed 's/-[0-9]\{10\}$//' | sed 's/-[a-z0-9]\{8,10\}$//'

    它将输出 helloworld 是的。

    现在,有了Python,我第一次尝试这样做 塞德 组别:

    newstring = re.sub(r'(s/-[a-z0-9]\{5\}$//)', r'\1', 'helloworld-5b5cf484-g582f')

    但它只输出副本,即 helloworld-5b5cf484-g582f

    我怎么能这样 塞德 命令?

    编辑:

    我的问题不是关于正则表达式。输入字符串比我举的例子更复杂。问题是如何在我使用的regex中prorperly使用re.sub():)

    2 回复  |  直到 6 年前
        1
  •  2
  •   Wiktor Stribiżew    6 年前

    sed s/-[a-z0-9]\{5\}$// 命令转换为 re.sub(r'-[a-z0-9]{5}$', '', s) .

    注:

    • BRE POSIX区间量词是不带转义符的, \{5\} => {5}
    • s/<pattern>/<repl>/ 方法 代替 <pattern> 具有 <repl> ,等于 re.sub('<pattern>', '<repl>', s, 1) (因为没有 g sed命令中的修饰符, 1 传递给 re.sub 只替换一个,第一个,出现)。

    修饰符作为选项传递,或者 旗帜 ,在 re.sub ,例如 re.sub(r'-[a-z0-9]{5}$', '', s, flags=re.I) ( re.I 是不区分大小写的修饰符)。小心,没必要用 修改器组件 回复:sub 默认情况下替换所有引用。

    您可以在 Python re documentation 是的。

        2
  •  0
  •   MCO System    6 年前

    正则表达式与您要执行的操作不匹配。

    实际上,您的代码正在替换一个5个字符长的alpha numric字符字符串,该字符串以连字符开头,在“helloworld-5b5cf484-g582f”(或类似的内容)中第一个匹配。

    由于字符串不是以连字符开头,因此无法发生这种情况。

    如果我是正确的,您希望用空字符串替换任何以连字符开头的5个字符或8个字符长的小写字母数字字符串。

    这可以通过以下代码实现:

    代码
    newstring = re.sub("(-[a-z0-9]{8})?(-[a-z0-9]{5})?", '', 'helloworld-5b5cf484-g582f')
    
    结果
    print newstring
    helloworld
    

    以下是指向重新模块doc的指针:

    1. 蟒蛇2: https://docs.python.org/2/library/re.html
    2. 蟒蛇3: https://docs.python.org/3/library/re.html