正则表达式完整单词模式

时间:2019-07-01 22:22:15

标签: python regex python-3.x

我想获得涉及完整单词而不是单词片段的模式。 例如。 12345 [some word] 1234567 [some word] 123 1679。随机文本和模式再次出现1111 123 [word] 555

这应该返回

[[12345, 1234567, 123, 1679],[1111, 123, 555]]

我只能容忍数字之间的一个单词,否则整个字符串都将匹配。 另请注意,捕获找到的2个匹配项非常重要,因此返回了一个由两个元素组成的列表。

我正在python3中运行它。 我尝试过:

\b(\d+)\b\s\b(\w+)?\b\s\b(\d+)\b

但是我不确定如何将其扩展到不受限制的比赛数量。

re.findall('\b(\d+)\b\s\b(\w+)?\b\s\b(\d+)\b', string)

这与[number] [word] [number]匹配,但不匹配后面跟有或没有单词的任何数字。

3 个答案:

答案 0 :(得分:2)

您无法使用Python re 引擎一次完成此操作。
但是您可以将序列与一个匹配项进行匹配,然后提取
与另一个数字。

这与序列匹配

r"(?<!\w)\d+(?:(?:[^\S\r\n]+[a-zA-Z](?:\w*[a-zA-Z])*)?[^\S\r\n]+\d+)*(?!\w)"

https://regex101.com/r/73AYLU/1

解释

 (?<! \w )                     # Not a word behind
 \d+                           # Many digits
 (?:                           # Optional word block
      (?:                           # Optional words
           [^\S\r\n]+                    # Horizontal whitespace
           [a-zA-Z]                      # Starts with a letter
           (?: \w* [a-zA-Z] )*           # Can be digits in middle, ends with a letter
      )?                            # End words, do once
      [^\S\r\n]+                    # Horizontal whitespace
      \d+                           # Many digits
 )*                            # End word block, do many times
 (?! \w )                      # Not a word ahead

这将从上面匹配的序列中获取数字数组(使用findall)

r"(?<!\S)(\d+)(?!\S)"

https://regex101.com/r/BHov38/1

解释

 (?<! \S )              # Whitespace boundary
 ( \d+ )                # (1)
 (?! \S )               # Whitespace boundary

答案 1 :(得分:1)

您是否期望re.findall()返回列表列表?无论您使用什么正则表达式,它都只会返回一个列表。

一种方法是将输入字符串分成句子,然后遍历句子

import re
inputArray = re.split('<pattern>',inputText)
outputArray = []
for item in inputArray:
    outputArray.append(re.findall('\b(\d+)\b\s\b(\w+)?\b\s\b(\d+)\b', item))
  

诀窍是找到一个<pattern>来分割您的输入。

答案 2 :(得分:0)

这有点复杂,也许这个表达式只是需要研究的东西:

(((\d+)\s*)*(?:\s*\[.*?\]\s*)((\d+)\s*)*)|([A-za-z\s]+)

并用脚本编写其余问题,以找到有效的解决方案。

Demo