正则表达单词内一个句号

时间:2013-03-31 03:14:24

标签: python regex

我在使用regexp匹配一个字符串时遇到了麻烦(我不是那个经验丰富的regexp)。我有一个字符串,其中包含每个单词和标记后面的正斜杠。一个例子:

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的第一个/ PERSON之前的所有内容都取而代之,而不只是匹配Timothy。有人可以帮助我如何进行这种匹配,同时包括一个句号作为缩写?或者至少,没有空字符串匹配?

谢谢,

2 个答案:

答案 0 :(得分:1)

匹配除空格字符([^ ]*)之外的所有内容。您还需要捕获中的星号(*):

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

答案 1 :(得分:1)

首先,(\w|.)匹配“一个单词字符或任何字符”(点匹配任何字符,这就是你获得这些空格的原因)。

使用反斜杠转义它可以解决问题:(\w|\.)

其次,正如@Ionut Hulub指出的那样,您可能希望使用+而不是*来确保您匹配某些内容,但正则表达式的工作原则是“最左侧” ,最长的“所以它总是试图匹配斜线前最长的部分。

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