使用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
如何修改(或完全重写)我的正则表达式,使其只捕获紧跟在我的正前瞻后面的组,而不捕获中间的额外字符?
4条答案
按热度按时间laawzig21#
为防止跳过数字,请使用
\D
非数字(上限为 * 求反 *\d
)。See this demo at regex101
进一步添加了word boundary并将 lookahead 更改为组。
798qvoo82#
如果希望捕获组没有任何监视:
\b
防止部分字匹配的字边界(\d+-\S*)
捕获组1,匹配1+位数-
和可选的非空白字符\s
匹配单个空白字符(?:LEFT|RIGHT|UP)
匹配任何备选项\b
字边界请参阅regex101上的捕获组值。
qvk1mo1f3#
这就是为什么你应该小心使用
.
来匹配任何东西,除非是绝对必要的。从你提供的例子来看,你实际上想要捕获的东西不包含空格,因此我们可以使用一个否定字符类[^\s]
,或者更准确地说[\w.]
,两种情况下都使用一个*
量词。你的最终结果看起来像
"(\d*-[\w.]*)(?=\sLEFT|\sRIGHT|\sUP)"gm
,当然,当.
在字符类中时,它被当作一个文本字符串--所以不需要转义。在regex101.com观看现场直播
wlzqhblo4#
试试这个:
第一个月
\b
字边界以忽略类似foo30-J.RICHARD
的内容\d+
匹配一个或多个数字。-
与文字-
匹配。[^\r \n]+
匹配除\r
、\n
和文本空格``之外的一个或多个字符。排除\r
和\n
有助于我们不跨越换行符,这就是为什么不使用\s
(即,它也匹配\r
和\n
)(?= +(?:LEFT|RIGHT|UP)\b)
使用正向前瞻。+
确保存在一个或多个文字空格``。(?:LEFT|RIGHT|UP)\b
使用非caputring组,请确保前面的空格``后跟以下单词之一:LEFT
、RIGHT
或UP
。\b
单词边界以忽略RIGHTfoo
或LEFTbar
。参见regex demo