如何让Regex_replace匹配Ansible中的特殊字符,并在其前面追加\?

问题描述:

我正在尝试创建一个正则表达式,该正则表达式匹配URL中的任何特殊字符,然后在其前面添加转义字符\。我创建了以下正则表达式,它正确捕获字符串中正确的字符,但它不会在特殊字符前添加\。如何让Regex_replace匹配Ansible中的特殊字符,并在其前面追加?

For example - test-google.com would look like test\-google\.com

- hosts: localhost 
    vars: 
    site: "test-google.com" 
    site2: "test.mywebsite.com" 

    tasks: 
    - name: Bad at regex 
    debug: 
     msg: "{{ site | regex_replace('[^\\w]', '[^\\\w]') }}" 

    register: regex 

    - debug: 
     msg: "{{ regex }}" 

我试图'[^\\'\'w]'以及'\w'

我怎么能做到这一点?

谢谢。

您可使用

msg: "{{ site | regex_replace(r'\W', r'\\\g<0>') }}" 

msg: "{{ site | regex_replace('\\W', '\\\\\\g<0>') }}" 

这里,\W任何非单词字符匹配,而替换字符串包含\(与正规,非4个反斜杠表示-raw,字符串文字和原始字符串文字中的反斜杠),然后用替换反向引用\g<0>表示整个匹配值。

+0

这大部分工作,谢谢!一个警告 - 当它进行替换时,它将附加两个而不是一个。示例 - 'test \\ - google \\。com' –

+1

@ J.Doe:可能与查看字符串的方式有关。在Python环境中,[这两行代码只输出1个反斜杠](https://ideone.com/nEGEhL)。 –

+0

是的,差不多。它看起来像每个https://github.com/ansible/ansible/issues/10067,这是由于调试打印输出的方式。它必须逃避/,所以它显示为//。它实际上只有一个/。 –