python 捕获具有正前瞻但不匹配模式的组的正则表达式

pieyvz9o  于 2023-01-01  发布在  Python
关注(0)|答案(4)|浏览(151)

使用regex(Python),我想捕获一个组\d-.+?,紧跟着另一个模式\sLEFT|\sRIGHT|\sUP
下面是我的测试集(来自http://nflsavant.com/about.php):

(9:03) (SHOTGUN) 30-J.RICHARD LEFT GUARD PUSHED OB AT MIA 9 FOR 18 YARDS (29-BR.JONES; 21-E.ROWE).
(1:06) 69-R.HILL REPORTED IN AS ELIGIBLE.  33-D.COOK LEFT GUARD TO NO 4 FOR -3 YARDS (56-D.DAVIS; 93-D.ONYEMATA).
(3:34) (SHOTGUN) 28-R.FREEMAN LEFT TACKLE TO LAC 37 FOR 6 YARDS (56-K.MURRAY JR.).
(1:19) 22-L.PERINE UP THE MIDDLE TO CLE 43 FOR 2 YARDS (54-O.VERNON; 51-M.WILSON).

我的最佳尝试是(\d*-.+?)(?=\sLEFT|\sRIGHT|\sUP),除非在匹配的捕获组和我的正向前瞻之间出现其他字符,否则该表达式将工作。在我的测试集的第二行中,此表达式捕获“69-R.HILL REPORTED IN AS ELIGIBLE. 33-D.COOK.”,而不是所需的“33-D.COOK”。
我的输入也保存在regex 101中,如下所示:https://regex101.com/r/tEyuiJ/1
如何修改(或完全重写)我的正则表达式,使其只捕获紧跟在我的正前瞻后面的组,而不捕获中间的额外字符?

laawzig2

laawzig21#

为防止跳过数字,请使用\D非数字(上限为 * 求反 * \d)。

\b(\d+-\D+?)\s(?:LEFT|RIGHT|UP)

See this demo at regex101
进一步添加了word boundary并将 lookahead 更改为组。

798qvoo8

798qvoo82#

如果希望捕获组没有任何监视:

\b(\d+-\S*)\s(?:LEFT|RIGHT|UP)\b
    • 说明**
  • \b防止部分字匹配的字边界
  • (\d+-\S*)捕获组1,匹配1+位数-和可选的非空白字符
  • \s匹配单个空白字符
  • (?:LEFT|RIGHT|UP)匹配任何备选项
  • \b字边界

请参阅regex101上的捕获组值。

qvk1mo1f

qvk1mo1f3#

这就是为什么你应该小心使用.来匹配任何东西,除非是绝对必要的。从你提供的例子来看,你实际上想要捕获的东西不包含空格,因此我们可以使用一个否定字符类[^\s],或者更准确地说[\w.],两种情况下都使用一个*量词。
你的最终结果看起来像"(\d*-[\w.]*)(?=\sLEFT|\sRIGHT|\sUP)"gm,当然,当.在字符类中时,它被当作一个文本字符串--所以不需要转义。
regex101.com观看现场直播

wlzqhblo

wlzqhblo4#

试试这个:

\b\d+-[^\r \n]+(?= +(?:LEFT|RIGHT|UP)\b)

第一个月

  • \b字边界以忽略类似foo30-J.RICHARD的内容
  • \d+匹配一个或多个数字。
  • -与文字-匹配。
  • [^\r \n]+匹配除\r\n和文本空格``之外的一个或多个字符。排除\r\n有助于我们不跨越换行符,这就是为什么不使用\s(即,它也匹配\r\n

(?= +(?:LEFT|RIGHT|UP)\b)使用正向前瞻。

  • +确保存在一个或多个文字空格``。
  • (?:LEFT|RIGHT|UP)\b使用非caputring组,请确保前面的空格``后跟以下单词之一:LEFTRIGHTUP\b单词边界以忽略RIGHTfooLEFTbar

参见regex demo

相关问题