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

2024-10-01 02:39:59 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我有问题从文本中提取特定的词使用正则表达式。 线路:

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

只有当limk在我要查找的单词之前或之后,并且如果limk在它之前,它应该在行的开头,如果它的后-应该在行的结尾,我才需要3个字母的单词作为输出。在这一行应该只有limk和价值,我正在寻找。你知道吗

预期产量:

ab1
ab4

我的正则表达式:

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

有人能解释我该怎么改正吗? 谢谢


Tags: 文本rest结尾字母单词线路价值za
3条回答
^([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+匹配一个或多个空格
  4. 匹配limk
  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

你可以用

(?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:三个alnum字符
  • |-或
    • ([0-9a-zA-Z]{3})-捕获组2:三个alnum字符
    • \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']

这是否符合您的要求:

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

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

相关问题 更多 >