正则表达式抓取字符串python中管道分隔的第一个和最后一个项目

时间:2014-08-13 11:12:12

标签: python regex

我有以下字符串

  

The | DT | I-MISC Oxford | NNP | I-MISC Companion | NNP | I-MISC to | TO | I-MISC理念| NNP | I-MISC说| VBZ | O,|,| O“| LQU | O那里| EX | O是| VBZ | O no | DT | O单| JJ | O定义| VBG | O位置| NN | O那个| IN | O all | DT | O无政府主义者| NNS | O hold | VBP | O,|,| O和| CC | O那些| DT | O考虑| VBN | O无政府主义者| NNS | O at | IN | O最佳| JJS | O股| NN | O a | DT | O确定| JJ | O族| NN | O相似性| NN | O。|。| O“| RQU | O.   在| IN | O | DT | O

我想得到每个三联的第一个和最后一个项目。所以对于| DT | I-MISC,我想要(The,I-MISC)。 这是我的实施,我想知道是否有更好更稳定的东西。

#STRAT 2: get first and third. this seems more stable
pat = r'((?<= ).+?(?=\|))'
nerpat = r'(?<=[A-Z]\|).+?(?= )'
print zip(re.findall(pat, y), re.findall(nerpat, y))

我的模式中的错误包括:下面的NNP | I-ORG。

  

('因此','O'),('克制','I-ORG'),('从','I-ORG'),('提交','I-ORG'),( 'to','I-ORG'),('any','O'),('特别','NNP | I-ORG'),('方法','O'),

与此部分文字相关:

  

,|,| O而| IN | O无政府主义者| NNS | O必须| MD | O总是| RB | O有| VB | O无政府状态| NN | O as | IN | O他们的| PRP $ | O end | | NN | O和| CC | O因此| RB | O refrain | VB | O from | IN | O commit | VBG | O to | TO | O any | DT | O特殊| JJ | O方法| NN | O的| IN | O达成| VBG | O it | PRP | O。|。| O

2 个答案:

答案 0 :(得分:2)

获取匹配的组表单索引1和2以获取每个三元组的第一个和最后一个项目

              ([^|]+)\|[^|]+\|([^|]+)
First item-----^^^^^^ ^      ^ ^^^^^-----------Last item
       First Pipe_____|      |_______Second pipe

这里是online demo

注意:添加\s以匹配任何空格字符[\r\n\t\f ],如以下评论中所示。

示例代码:

import re
p = re.compile(ur'([^|]+)\|[^|]+\|([^|]+)')
test_str = u"..."

re.findall(p, test_str)

模式说明:

 (                        group and capture to \1:
    [^|]+                    any character except: '|' (1 or more times)
  )                        end of \1

  \|                       '|'
  [^|]+                    any character except: '|' (1 or more times)
  \|                       '|'

  (                        group and capture to \2:
    [^|]+                    any character except: '|' (1 or more times)
  )                        end of \2

了解更多关于

的信息

答案 1 :(得分:1)

您可以使用re.split分割字符串:

import re
terms = re.split('[| ]', y)
print zip(terms[::3], terms[2::3])

我喜欢的另一个是使用operator.itemgetter

from operator import itemgetter
filter = itemgetter(0, 2)
print [filter(triplet.split('|')) for triplet in y.split()]