正则表达式,在另一个词之前和之后提取词

时间:2019-09-05 09:49:33

标签: python regex

您好,我在使用正则表达式从文本中提取特定单词时遇到问题。 行:

limk ab1
limk ab2 helo
rest helo
ab3 limk helo
ab4 limk

仅当limk在我要查找的单词之前或之后,并且limk在它的开头时,我才需要3个字母作为输出其之后-应该在该行的末尾。在这一行中,我只需要寻找潜伏的事物和价值。

预期输出:

ab1
ab4

我的正则表达式:

r'(^[0-9a-zA-Z]{3} \blimk\b)|(\blimk\b [0-9a-zA-Z]{3}$)'

有人可以解释我应该如何纠正它? 谢谢

3 个答案:

答案 0 :(得分:1)

这是您想要的吗?

^(\w{3}) limk$|^limk (\w{3})$

https://regex101.com/r/S1OMmi/2

答案 1 :(得分:1)

您可以使用

(?m)^(?:limk\s+([a-zA-Z0-9]{3})|([a-zA-Z0-9]{3})\s+limk)$

请参见regex demo

详细信息

  • (?m)-使锚点与换行符匹配
  • ^-一行的开头
  • (?:-容器非捕获组的开始(将锚应用于所有替代方案):
    • limk-limk位于行尾
    • \s+-超过1个空格
    • ([0-9a-zA-Z]{3})-捕获第1组:三个数字字符
  • |-或
    • ([0-9a-zA-Z]{3})-捕获第2组:三个数字字符
    • \s+-超过1个空格
    • limk-一个limk
  • )-分组结束
  • $-字符串的结尾。

Python code

import re
rx = re.compile(r"^(?:limk\s+([a-zA-Z0-9]{3})|([a-zA-Z0-9]{3})\s+limk)$", re.M)
s = "limk ab1\nlimk ab2 helo\nrest helo\nab3 limk helo\nab4 limk"
print (["{}{}".format(x,y) for x,y in rx.findall(s)])
# => ['ab1', 'ab4']

答案 2 :(得分:1)

^([0-9a-zA-Z]{3})\s+limk$|^limk\s+([0-9a-zA-Z]{3})$
  1. ^匹配行的开头
  2. [0-9a-zA-Z] {3}匹配大小写的ascii字符以及长度为3的数字
  3. \ s +匹配1个或更多空格
  4. 匹配潜行
  5. $匹配行尾
  6. |第二种替代方法的开始:
  7. ^匹配行的开头
  8. 匹配limk
  9. \ s +匹配一个或多个空格
  10. [0-9a-zA-Z] {3}匹配大小写的ascii字符以及长度为3的数字
  11. $匹配行尾

代码:

import re

s = """limk ab1
limk ab2 helo
rest helo
ab3 limk helo
ab4 limk"""

matches = [x[0] if x[0] != '' else x[1] for x in re.findall(r'(?m)^([0-9a-zA-Z]{3})\s+limk$|^limk\s+([0-9a-zA-Z]{3})$', s)]
for match in matches:
    print(match)

打印:

ab1
ab4

See Demo