2017-03-15 78 views
0

我有这个旧文档,我正在帮助清理并转换成数据集。这是一项以访谈的形式进行的研究,但不幸的是,实施这项研究的人员包括速写笔记,这些笔记与受访者的回答混合在一起。这个过程的第一步是我将这些笔记与回复分开。然后,我想创建一个.csv,其中包含一个包含响应的列和另一个包含备注的列。在Python中搜索文档并分离正则表达式

这里是什么在研究的数据目前看起来像(从我犯了一个小test.txt文件)的例子:

$ AKAR3NDA.S+ QRUSS/)+ A BLAJ3R 
0 
FIN ABIXU/BRIVNS+TELE 
IB3G81S+R1.B+ QI KOPIRN /AKCENT CLN VERBS+TAM XX(010 

什么我在与使用Python的re模块真正的麻烦挑出我正在搜索的任何正则表达式。现在我只通过查看是否可以打印单独的注释和响应来测试它,所以我会将.csv部分从我的代码中移出。这里是我的代码,我有:

1 import re 
2 
3 notation = r"(^\+ | \+$ | ^- | -$ | \+ BUT\b | - BUT\b | ^\$ | \$$ | ^\+\$ | \+\$$ | ^-\$ | -\$ | DRWG | QB\b | QT\b | QBF | QTF | QFR | ^= | =$ | Q a Q | QP\b | QM/Y | QF/Y | ^\* | \*$ | QU\b | Q-U | QUU | QR\b | QRR | QH\b | QS\b | QW\b | Q-W | QAP | Q-AP | QN\b | QNN | QOF | QOOF | QK\b | Q-K | QLIT | QV\b | QEM | QVL | QDG | QAMER | QHUM | QELSW | QRTR | QSMT | QOTW | QNEX | QET\b | QPOL | QRUSS | QRUM | QHUNG | QGERM | QSYN | QGL\b | QGLY | QYID | QGLE | QENG | QI GL | QANG | QI\b | ^\) | \)$ | ^\)\+ | \)\+$ | ^\)- | \)-$ | ^\)= | \)=$ | EQ | \|\| | QCF | QZZ | QZT | \.\.\.{1} | QETC | QVB | QADJ | QINF | QNOUN | /[^/]+/ | \b/ | \bCM\b | \bCLN\b | \bSC\b | \bXX\b | QQ\b | ^0\b | ^O\b | QNT | Q-T | QLAT | QTA | QNP | QMEMX | \u2721 | QED\b | QEDS | \(/[0-9]* | \([0-9]* | \(\$[0-9]* | \(\(| QEDN | OVRPMP | MISPMP | MISTD)" 
4 
5 notesSeparate = [] 
6 
7 with open("test.txt") as f: 
8 data = f.readlines() 
9 
10 for line in data: 
11 newRow = [] 
12 notes = str(re.findall(notation, line)) 
13 response = str(re.sub(notation, "", line)) 
14 newRow.append(response) 
15 newRow.append(notes) 
16 notesSeparate.append(newRow) 
17 
18 print notesSeparate 

我也意识到,正则表达式是丑陋又长,但我不知道如何将其格式化,所以请任何指针上也欢迎。无论如何,当我运行该文件时得到的是以下输出。

[['$ AKAR3NDA.S+ QRUSS/)+ A BLAJ3R\n', '[]'], ['0\n', '[]'], ['FIN 
ABIXU/BRIVNS+TELE\n', '[]'], ['IB3G81S+R1.B+KOPIRN /AKCENTVERBS+TAM 
XX(010', "[' QI ', ' CLN ']"]] 

我想越来越是:

[['AKAR3NDA.S+ A BLAJ3R\n', ('$', 'QRUSS/)+')], ['0\n', ('')], ['FIN 
ABIXU/BRIVNS+TELE\n', ('')], ['IB3G81S+R1.B+KOPIRN /AKCENTVERBS+TAM', 
(' QI ', ' CLN ', 'XX(010')]] 

我知道这一切都是那么凌乱,但是这是一种点的 - 我试图把东西是超级凌乱,使它不那么如此。我无法告诉你我会多么感激某个方向。

回答

0

我不知道这是不是你正在寻找的东西,但是这应该让至少
运行更快 - 如果你关心这个。
它可能不会让它更容易管理。

顺便说一句,我假设你的正则表达式是扩展(即忽略空白)。
此外,为什么这个特定的代码点\u2721 ✡ STAR OF DAVID

(?:(?:^(?:\$|\)[+=-]?|\*|\+\$?|-\$?|[O0]\b|=))|(?:(?:\$|\)[+=-]?|\*|\+\$?|-|=)$)|Q[BHKNPRSTUVW]\b|(?:(?:[+-]BUT|Q(?:E[DT]|GL|[IQ]))\b)|(?:\b(?:/|(?:C(?:LN|M)|SC|XX)\b))|\|{2}|\.{3}|/[^/]+/|\(/\d*|\(\d*|\(\$\d*|\(\(|-\$|\u2721|(?:DRWG|EQ|MIS(?:PMP|TD)|OVRPMP|Q(?:-(?:AP|[KTUW])|A(?:DJ|MER|NG|P)|BF|CF|DG|E(?:D[NS]|LSW|M|NG|TC)|F(?:/Y|R)|G(?:ERM|L[EY])|HU(?:M|NG)|I(?:GL|NF)|L(?:AT|IT)|M(?:/Y|EMX)|N(?:EX|OUN|[NPT])|O(?:F|OF|TW)|POL|R(?:R|TR|U(?:M|SS))|S(?:MT|YN)|T[AF]|UU|V[BL]|YID|Z[TZ]|aQ)))

格式化

(?: 
     (?: 
     ^
      (?: 
       \$ 
      | \) [+=-]? 
      | \* 
      | \+\$? 
      | -\$? 
      | [O0] \b 
      | = 
      ) 
    ) 
    | (?: 
      (?: \$ | \) [+=-]? | \* | \+\$? | - | =) 
      $ 
    ) 
    | Q [BHKNPRSTUVW] \b 
    | (?: 
      (?: 
       [+-] BUT 
      | Q 
       (?: E [DT] | GL | [IQ]) 
      ) 
      \b 
    ) 
    | (?: 
      \b 
      (?: 
       /
      | (?: 
        C 
        (?: LN | M) 
        | SC 
        | XX 
       ) 
       \b 
      ) 
    ) 
    | \|{2} 
    | \.{3} 
    |/[^/]+/
    | \(/ \d* 
    | \(\d* 
    | \(\$ \d* 
    | \(\(
    | -\$ 
    | \u2721 
    | (?: 
      DRWG 
     | EQ 
     | MIS 
      (?: PMP | TD) 
     | OVRPMP 
     | Q 
      (?: 
       - 
       (?: AP | [KTUW]) 
      | A 
       (?: DJ | MER | NG | P) 
      | BF 
      | CF 
      | DG 
      | E 
       (?: D [NS] | LSW | M | NG | TC) 
      | F 
       (?: /Y | R) 
      | G 
       (?: ERM | L [EY]) 
      | HU 
       (?: M | NG) 
      | I 
       (?: GL | NF) 
      | L 
       (?: AT | IT) 
      | M 
       (?: /Y | EMX) 
      | N 
       (?: EX | OUN | [NPT]) 
      | O 
       (?: F | OF | TW) 
      | POL 
      | R 
       (?: 
        R 
        | TR 
        | U 
        (?: M | SS) 
       ) 
      | S 
       (?: MT | YN) 
      | T [AF] 
      | UU 
      | V [BL] 
      | YID 
      | Z [TZ] 
      | aQ 
      ) 
    ) 
) 
+0

感谢这么多 - 我想给一个尝试,看看能否改善我的代码。为了回答你关于大卫之星unicode的问题,我正在尝试清理的文档是OCRed(我确信一旦将此代码付诸实践,我将会介绍一组全新的挑战)。其中的一个角色可能会看起来像大卫之星,所以我把它包括在内是安全的。 我实际上不确定扩展/忽略空白是什么......你能解释一下还是指向我一个好的资源? – bkula

+0

@bkula - 这是发生了什么。 'sub(notation,“,line)'不匹配任何东西,_newRow_附加_ [原始行] _。 're.findall(notation,line)'找不到任何东西,_newRow_附加_ [] _。基本的问题是,为了格式化正则表达式,没有任何东西是匹配的,因为你已经将_spaces_放在你想要匹配的东西的周围,但这些空格实际上并不在源中。当调用'sub()'或'findall()'或者在string_的开头添加内联修饰符'(?x)(?: )'时,尝试使用忽略空白标志。 – sln

+0

小费。你可能想要得到这个应用程序[RegexFormat](http://www.regexformat。让它为你格式化和压缩。 – sln