Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python在regexp中的特殊字符问题_Python_Regex_String Literals - Fatal编程技术网

python在regexp中的特殊字符问题

python在regexp中的特殊字符问题,python,regex,string-literals,Python,Regex,String Literals,我在xml文件上应用一些正则表达式来查找和替换值。正常情况下,它可以工作。(我听到有人说“使用xml解析器”。与此同时,我不能。)但如果值中有特殊字符,它会破坏一切 我想我有一个如下所示的xml文件: <fieldset> <idle1> <value>something\\n</value> </idle1> <idle2> <value>blabla</value>

我在xml文件上应用一些正则表达式来查找和替换值。正常情况下,它可以工作。(我听到有人说“使用xml解析器”。与此同时,我不能。)但如果值中有特殊字符,它会破坏一切

我想我有一个如下所示的xml文件:

<fieldset>
  <idle1>
     <value>something\\n</value>
  </idle1>
  <idle2>
    <value>blabla</value>
  </idle2>
</fieldset>
对于替换:

self.replacePattern=`\g<1>\g<2>\g<3>\g<4><value>denemeasdasd\\\\n</value>\g<8>\g<9>\g<10>\g<11>`
这是用来替换的

outtext = self.pattern.sub(r''''''+self.replacePattern+'''''',r''''''+self.match.group(0)+'''''')

我发现在处理不可预测的数据源时最好将有效字符列入白名单。 因此,在替换任何其他正则表达式的同时,删除任何未列入白名单的内容,即a-z 0-9:-


查看您的数据,为您的任务确定合适的白名单。

我不理解您的解释

就我个人而言,我写了这封信:

import re

RE = ('(^([ \t]+)<(idle2)>(?:\n|\r\n?)[ \t]+<value>)'
      '(.*?)'
      '(?=</value>(?:\n|\r\n?)\\2</\\3>)')

print repr(ch),'\n'
print ch
print '\n-------------------------------------------------'
print repr(re.sub(RE,'\\1AAA',ch,flags = re.M)) , '\n'
print re.sub(RE,'\\1-----HHHHHHXXXXXXX-------',ch,flags = re.M)
重新导入
RE=(“(^([\t]+)(?:\n |\r\n?[\t]+)”
'(.*?)'
“(?=(?:\n |\r\n?\\2)”
打印报告(ch),“\n”
打印ch
打印“\n-------------------------------------------”
打印报告(re.sub(re,'\\1AAA',ch,flags=re.M)),'\n'
打印re.sub(re,\\1---HHHHHHXXXXXXX---',ch,flags=re.M)
结果

'<fieldset>\n  <idle1>\n    <value>something\\n</value>\n  </idle1>\n  <idle2>\n    <value>blabla</value>\n  </idle2>\n</fieldset>'

<fieldset>
  <idle1>
    <value>something\n</value>
  </idle1>
  <idle2>
    <value>blabla</value>
  </idle2>
</fieldset>

-------------------------------------------------
'<fieldset>\n  <idle1>\n    <value>something\\n</value>\n  </idle1>\n  <idle2>\n    <value>AAA</value>\n  </idle2>\n</fieldset>'

<fieldset>
  <idle1>
    <value>something\n</value>
  </idle1>
  <idle2>
    <value>-----HHHHHHXXXXXXX-------</value>
  </idle2>
</fieldset>
“\n\n某物\\n\n\n\n blabla\n\n”
一些东西\n
布拉布拉
-------------------------------------------------
“\n\n某物\\n\n\n\n AAA\n\n”
一些东西\n
-----HHHHXXXXXX-------

这是你想要的吗?

好吧,我所做的和你所解释的一样。但在正则表达式中必须有一种方法来处理它。因此,要使用我的方法,在替换之前,您需要执行正则表达式,将所有非白名单字符替换为“”。这样,您就不必担心如何处理当前代码中的任何隐藏字符或特殊字符。幸运的是,你不必改变你所拥有的一切。@savruk、、和、、之间有什么联系?etc的含义是什么?这是什么:denemeasdasd?什么是self.searchPattern@eyquem我编辑了xml,您可以看到连接\g表示保持不变的第1组。“denemeasdasd\\\n”是“.@savruk”的替换值(新值)。如果我尝试替换“”节点中的值,则“”节点的值将变为“某物”\n”“为什么?请出示密码。这不应该发生。事实上,您是否在所有节点中分别替换与编号有关的节点@萨夫鲁克谢谢你。如果这真的是一个很好的答案,也是最好的答案,你可以通过点击三角向下投票按钮下面的白色V形按钮来接受它。答案影响25分,而不是10分。@savruk谢谢。我不被分数所困扰,但我允许在其他答案上被否决,而不太担心自己的愚蠢(是的,我做了愚蠢的答案)
outtext = self.pattern.sub(r''''''+self.replacePattern+'''''',r''''''+self.match.group(0)+'''''')
import re

RE = ('(^([ \t]+)<(idle2)>(?:\n|\r\n?)[ \t]+<value>)'
      '(.*?)'
      '(?=</value>(?:\n|\r\n?)\\2</\\3>)')

print repr(ch),'\n'
print ch
print '\n-------------------------------------------------'
print repr(re.sub(RE,'\\1AAA',ch,flags = re.M)) , '\n'
print re.sub(RE,'\\1-----HHHHHHXXXXXXX-------',ch,flags = re.M)
'<fieldset>\n  <idle1>\n    <value>something\\n</value>\n  </idle1>\n  <idle2>\n    <value>blabla</value>\n  </idle2>\n</fieldset>'

<fieldset>
  <idle1>
    <value>something\n</value>
  </idle1>
  <idle2>
    <value>blabla</value>
  </idle2>
</fieldset>

-------------------------------------------------
'<fieldset>\n  <idle1>\n    <value>something\\n</value>\n  </idle1>\n  <idle2>\n    <value>AAA</value>\n  </idle2>\n</fieldset>'

<fieldset>
  <idle1>
    <value>something\n</value>
  </idle1>
  <idle2>
    <value>-----HHHHHHXXXXXXX-------</value>
  </idle2>
</fieldset>