如何让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>
表示整个匹配值。
这大部分工作,谢谢!一个警告 - 当它进行替换时,它将附加两个而不是一个。示例 - 'test \\ - google \\。com' –
@ J.Doe:可能与查看字符串的方式有关。在Python环境中,[这两行代码只输出1个反斜杠](https://ideone.com/nEGEhL)。 –
是的,差不多。它看起来像每个https://github.com/ansible/ansible/issues/10067,这是由于调试打印输出的方式。它必须逃避/,所以它显示为//。它实际上只有一个/。 –