我想获得涉及完整单词而不是单词片段的模式。
例如。 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]
匹配,但不匹配后面跟有或没有单词的任何数字。
答案 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]+)
并用脚本编写其余问题,以找到有效的解决方案。