首页 > 解决方案 > 在字符前提取单词

问题描述

我正在尝试提取Y边界分隔之前的任何单词。因为我试图将每一行视为使用(?m)标志的单独记录并尝试捕获\w+前瞻\s+Y,但我只能打印第一场比赛,而不是第二场比赛(IMP1)。

print(foo)
this is IMP Y text
and this is also IMP1 Y text
this is not so IMP2 N text
Y is not important

当前徒劳的尝试:

>>> m = re.search('(?m).*?(\w+)(?=\s+Y)',foo)
>>> m.groups()
('IMP',)
>>>
>>> m = re.search('(?m)(?<=\s)(\w+)(?=\s+Y)',foo)
>>> m.groups()
('IMP',)
>>>

预期结果是:

('IMP','IMP1')

标签: pythonregexregex-lookaroundspositive-lookahead

解决方案


您可以使用

\w+(?=[^\S\r\n]+Y\b)

请参阅正则表达式演示。细节:

  • \w+- 一个或多个字母/数字/下划线 -(?=[^\S\r\n]+Y\b)紧随其后的是一个或多个除 CR 和 LF 之外的空格,然后Y作为一个完整的单词(\b是单词边界)。

查看Python 演示

import re
foo = "this is IMP Y text\nand this is also IMP1 Y text\nthis is not so IMP2 N text\nY is not important"
print(re.findall(r'\w+(?=[^\S\r\n]+Y\b)', foo))
# => ['IMP', 'IMP1']

推荐阅读