2013-03-31 68 views
0

我遇到麻烦匹配字符串与正则表达式(我没有经验与正则表达式)。我有一个字符串,其中包含每个单词和标签后面的正斜杠。举个例子:正则表达式单词中的单词与全阻

led/O by/O Timothy/PERSON R./PERSON Geithner/PERSON ,/O the/O president/O of/O the/O New/ORGANIZATION

在这些字符串,我只是在这之前/PERSON所有字符串感兴趣。下面是我想出了正则表达式模式:

(\w)*\/PERSON

而且我的代码:

match = re.findall(r'(\w)*\/PERSON', string) 

基本上,我匹配/PERSON之前出现的单词。输出:

>>> reg 
['Timothy', '', 'Geithner'] 

我的问题是,第二场比赛,匹配到一个空字符串作为R./PERSON,点不是单词字符。我改变了我的正则表达式来:

match = re.findall(r'(\w|.*?)\/PERSON', string) 

但比赛现在是:

['led/O by/O Timothy', ' R.', ' Geithner']

这是第一个/人,其中包括led/O by/O,而不是只匹配Timothy之前采取一切。有人可以帮助我如何做这个匹配,而包括一个完整的中止作为一个缩写?或者至少,没有一个空字符串匹配?

感谢,

回答

1

比赛的一切,但一个空格字符([^ ]*)。您还需要捕捉里面的明星(*):

match = re.findall(r'([^ ]*)\/PERSON', string) 
1

首先,(\w|.)匹配“单词字符,或任何字符”(点这就是为什么你得到那些空间匹配任何字符)。

逃离这个用反斜杠将这样的伎俩:(\w|\.)

其次,@Ionut Hulub指出,你可能需要使用+而不是*确保你匹配东西不过正则表达式的工作原理“最左边,最长”,所以它总是会尝试匹配斜线前的最长部分。

如果你想匹配你可以使用\S代替(\w|\.),这实际上可能是你想要的任何非空白字符。