删除制表符分隔文件中引用列中的空格字符?

时间:2013-12-08 16:50:48

标签: python regex python-3.x

我有一个类似的文本文件并得到了很大的帮助来解决它,但我必须意识到我对一般的编程和regex来说太新了,特别是修改了steveha下面编写的优秀Python脚本对于Similar file

编辑:我想摆脱标签,换行符和其他字符而不是“普通”字样,数字,感叹号,问号,圆点 - 以便获得干净的CSV并从那里做文本分析。

import re
import sys

_, infile, outfile = sys.argv

s_pat_row = r'''
    "([^"]+)"  # match column; this is group 1
    \s*,\s*  # match separating comma and any optional white space
    (\S+)  # match column; this is group 2
    \s*,\s*  # match separating comma and any optional white space
    "((?:\\"|[^"])*)"  # match string data that can include escaped quotes
'''
pat_row = re.compile(s_pat_row, re.MULTILINE|re.VERBOSE)

s_pat_clean = r'''[\x01-\x1f\x7f]'''
pat_clean = re.compile(s_pat_clean)

row_template = '"{}",{},"{}"\n'

with open(infile, "rt") as inf, open(outfile, "wt") as outf:
    data = inf.read()
    for m in re.finditer(pat_row, data):
        row = m.groups()
        cleaned = re.sub(pat_clean, ' ', row[2])
        words = cleaned.split()
        cleaned = ' '.join(words)
        outrow = row_template.format(row[0], row[1], cleaned)
        outf.write(outrow)

我无法弄清楚如何修改它以匹配此文件,其中有\ t分隔列和文本而不是第二列中的数字。我的目标是让清理后的文本准备好进行内容分析,但在我熟悉之前,我似乎已经有了多年的学习......; - )

有人可以帮我修改它,以便它可以在下面的数据文件中使用吗?

"from_user" "to_user"   "full_text"
"_________erik_"    "systersandra gigantarmadillo kuttersmycket NULL NULL"  "\"men du...? är du bi?\". \"näeh. Tyvärr\" #fikarum,Alla vi barn i bullerbyn goes #swecrime. #fjällbackamorden,Ny mobil och en väckare som ringer 0540. #fail,När jag måste välja, \"äta kakan eller ha den kvar\", så carpe diar jag kakan på sekunden. #mums,Låter RT @bobhansson: Om pessimisterna lever 7 år kortare är det ju inte alls konstigt att dom är det.

http://t.co/a1t5ht4l2h,Finskjortan på tork:     Check! Dags att leta fram gå-bort skorna..."

1 个答案:

答案 0 :(得分:0)

如果您的CSV文件使用制表符分隔符而不是逗号,那么在s_pat_row中,您应该将,个字符替换为\t。此外,示例文本文件中的第二个字段包含空格,因此(\S+)中的s_pat_row模式将不匹配。你可以试试这个:

s_pat_row = r'''
    "([^"]+)"          # match column; this is group 1
    \s*\t\s*           # match separating tab and any optional white space
    ([^\t]+)           # match a string of non-tab chars; this is group 2
    \s*\t\s*           # match separating tab and any optional white space
    "((?:\\"|[^"])*)"  # match string data that can include escaped quotes
'''

这可能足以解决您当前的问题。