带有可选单词查找的正则表达式后面

问题描述 投票:1回答:1

我需要从这些字符串中提取名称(例如:“ L。Odem”或“ A. Bargani”)

Technical foul by L. Odom
Offensive foul by A. Bargnani (drawn by D. Granger)
Flagrant foul type 1 by B. Miller (drawn by J. Smith)
Flagrant foul type 1 by A. Croshere
Flagrant foul type 2 by M. Olowokandi
Away from play foul by R. Rogers
Offensive foul by T. MacCulloch
Personal foul by D. George

这是我尝试过的:

"(?<=foul by ).*"

这在大多数情况下都有效,但被“犯规”和“ by”之间具有“类型1”或“类型2”的明显犯规或以括号信息结尾且始终以“(通过

我觉得我已经接近了,但是可以使用一些帮助来解决这些问题。

非常感谢!

r regex
1个回答
1
投票

您可以在后面添加第二个替代名称,并使用[^()]+[^()]*[^()\s]来匹配名称,直到第一个(

(?<=foul by |foul type [12] by )[^()]*[^()\s]

请参见regex demo。在R中,使用

stringr::str_extract(x, "(?<=foul by |foul type [12] by )[^()]*[^()\\s]")

正则表达式详细信息

  • [(?<=foul by |foul type [12] by )-foul byfoul type 1 byfoul type 2 by必须立即显示在当前位置的左侧
  • [[^()]*-0或多个()]以外的字符>
  • [[^()\s]-除空格,()外的一个字符。
  • 替代项:

stringr::str_match(x, "foul(?:\\s+type\\s+\\d+)?\\s+by\\s+([^()]*[^()\\s])")[,2]

This将找到名称,即使foultype等之间的空格不一致,并且\d+将匹配112等(任何1+数字)] >

regmatches(x, regexpr("foul(?:\\s+type\\s+\\d+)?\\s+by\\s+\\K[^()]*[^()\\s]", x, perl=TRUE)

[This regex是带有PCRE正则表达式的基R变体,它也允许不一致地使用空格和type之后的任何1+数字。

详细信息

  • [foul-一个foul字符串]
  • (?:\s+type\s+\d+)?-可选序列
    • [\s+type\s+-type用1+空格括起来]
    • \d+-1个以上的数字
  • [\s+by\s+-by用1+空格括起来]
  • \K-匹配重置运算符。
  • © www.soinside.com 2019 - 2024. All rights reserved.