【问题标题】:Regexp Word within a word with a fullstop带有句号的单词中的正则表达式单词
【发布时间】:2013-03-31 03:14:23
【问题描述】:

我在将字符串与正则表达式匹配时遇到问题(我对正则表达式没有经验)。我有一个字符串,它在每个单词和一个标签之后都包含一个正斜杠。一个例子:

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']

它会获取第一个 /PERSON 之前的所有内容,其中包括 led/O by/O 而不仅仅是匹配 Timothy。有人可以帮助我如何进行这种匹配,同时包括一个句号作为缩写吗?或者至少,没有空字符串匹配?

谢谢,

【问题讨论】:

    标签: python regex


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      使用反斜杠转义即可:(\w|\.)

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

      如果你想匹配任何个非空白字符,你可以使用\S而不是(\w|\.),这可能正是你想要的。

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2021-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 2022-12-10
        相关资源
        最近更新 更多