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

开头的特殊字符,与每个单词的结尾匹配[仅限regex]

  •  1
  • killown  · 技术社区  · 14 年前

    使用regex从每个单词的开头和结尾删除特殊字符的最佳解决方案是什么?

    “as df--as df-as df(as df)”as df“as df as df”(asd-f as df“asd-f”-as df-%s as df&$as df$+as df+as df++as df''”

    输出应为:

    “as df--as df-as df(as df)as df as df as df”(asd-f as df'asd-f'as df%as df%s as df&as df as df++as df'”

    如果开头的特殊字符与结尾匹配,请将其删除

    我在学雷吉克斯。 [仅正则表达式]

    2 回复  |  直到 14 年前
        1
  •  1
  •   Nick T twasbrillig    14 年前
    import re
    a = ("as-df-- as-df- as-df (as-df) 'as-df' asdf-asdf) (asd-f"
         "asdf' asd-f' -asdf- %asdf%s asdf& $asdf$ +asdf+ asdf++ asdf''")
    b = re.sub(r"((?<=\s)|\A)(?P<chr>[-()+%&'$])([^\s]*)(?P=chr)((?=\s)|\Z)",r"\3",a)
    print b
    

    给予:

    as-df-- as-df- as-df (as-df) as-df asdf-asdf) (asd-f
    asdf' asd-f' asdf %asdf%s asdf& asdf asdf asdf++ asdf''
    

    让不完全相同的字符工作更难。 () , [] , {}

        2
  •  1
  •   LarsH    14 年前

    对于Perl,怎么样 /\b([^\s\w])\w+\1\b/g ?注意,像\b这样的东西在所有regex语言中都不起作用。

    哎呀,正如@nick指出的那样,这对不完全相同的对不起作用,比如()[]等。

    相反,你可以这样做:

     s/\b([^\s\w([\]){}])\w+\1\b/\2/g
     s/\b\((\w+)\)\b/\1/g
     s/\b\[(\w+)\]\b/\1/g
     s/\b\{(\w+)\}\b/\1/g
    

    (未经测试)