使用re替换unicode字符串

时间:2017-05-05 09:49:10

标签: python regex python-2.7

我已经在ubuntu中使用pdftotext -raw /path/to/pdf.pdf /path/to/output.txt将pdf文档转换为文件。我使用sample = open("/path/to/output.txt").read()读取转换后的文件。现在示例有未解码的unicode字符串,如\xe2\x80\x99。我想用''使用正则表达式替换它们。我使用了模式re.sub(r"""\\\\"""," ",sample),re.sub(r'\\x..',"",sample),re.sub(r'\\\\x..'," ",sample)

例如,拿这个

abc="CTIinfo@thecoaches.com\n\x0c"
re.sub(r'\\x..',"",abc)
re.sub(r'\\\\x..'," ",abc)
abc.encode("ascii","ignore")

我评估\\x..模式using this online regex tester选择语言为python also this,并根据this SO Question's answer的引用使用\\\\x..模式,但两者都给了我CTIinfo@thecoaches.com\n\x0c作为输出。它不会删除那些unicode字符串。我不想使用模式\\\w..,因为它可能会选择转义序列。甚至我尝试了抛出UnicodeDecodeError的abc.encode('utf8')。我理解问题是因为\x??被读作字符串但我不知道如何解决这个问题。

如果您想对解决方案进行测试,请使用以下:

182\nWheel of Life, 24\xe2\x80\x9325, 135\xe2\x80\x93136
\n194\xe2\x80\x93195
CTI\xe2\x80\x99s\ntraining enables participants 
80\xe2\x80\x9383

这些测试字符串的预期输出应为

182\nWheel of Life, 2425, 135136
\n194195
CTIs\ntraining enables participants 
8083

注意:

我也试过

abc=abc.decode("utf-8")
abc=abc.encode("ascii","ignore")

这会删除一些字符,但我仍然可以看到一些字符串,例如\x0c 表单提要 ,所以我只想用正则表达式来替换这些字符串。< / p>

尝试正则表达式:

abc="CTIinfo@th\x0c\xc0ecoaches.com\n\x0c" #input

re.sub(r'[\\x[a-fA-F0-7]-\\x[a-fA-F0-7]]+',' ',abc)
re.sub(r'[^\x00-\x7F]+',' ',abc)
re.sub(r'\\x..',"",abc)
re.sub(r'\\\\x..'," ",abc)

请添加downvoting的原因。因为它会帮助我理解我的错误。问题可能很简单,但需要解决方案。在发布之前我做了很多研究和实验,我希望人们会重视它们

2 个答案:

答案 0 :(得分:0)

找到修复字符范围\x00-\x7f包括键盘中的所有字符,因此re.sub(r'[^\x00-\x7f]+','', abc)替换每个字符,结果为''

\f\v等不可打印的字符被python解释器识别为\x0c\x0b,其他不可打印的字符被识别为例如:\n\r\b被识别为\n\r\b }。因此,为了仅替换\x0c\x0b \f\v但跳过其他转义序列和字符,正则表达式将re.sub(r'[\x0b-\x0c]','',(re.sub(r'[^\x00-\x7f]+','', abc)))re.sub(r'[^\x00-\x7f]+','', abc).replace("\f","").replace("\v","")也可以

正则表达式替换替换字符串中的\x0b,\x0c,并保留其他不可打印字符。这也是由str.replace()

\f and \v完成的

只有这两个字符在python识别中有所不同,因为只有这两个字符组合了其他两个转义序列的功能。

示例:

\f ==> \n+\r
\v ==> \n+\t

答案 1 :(得分:-2)

请参阅此链接How does \v differ from \x0b or \x0c?

\ x不是分开的,这四个字符是一组。

应用re.sub(R&#34; \ X0C&#34;&#34;&#34;,ABC)