我想在两个~
之间找到所有可能出现的文字。
例如:对于文本~*_abc~xyz~ ~123~
,我希望以下表达式作为匹配模式:
~*_abc~
~xyz~
~123~
注意它可以是字母或数字。
我尝试使用正则表达式~[\w]+?~
,但它没有给我~xyz~
。我希望重新考虑~
。但我不希望仅~~
作为可能的匹配。
答案 0 :(得分:5)
将capturing inside a positive lookahead与以下正则表达式一起使用:
有时,您需要在同一个单词中进行多次匹配。例如,假设您要从
ABCD
这样的字符串中提取ABCD
,BCD
,CD
和D
。你可以用这个单一的正则表达式来实现:
(?=(\w+))
在字符串的第一个位置(
A
之前),引擎启动第一次匹配尝试。前瞻断言紧接当前位置之后的是一个或多个单词字符,并将这些字符捕获到组1.前瞻成功,匹配尝试也是如此。由于模式不匹配任何实际字符(前瞻仅查看),引擎返回零宽度匹配(空字符串)。它还返回第1组捕获的内容:ABCD
然后引擎移动到字符串中的下一个位置并开始下一个匹配尝试。同样,前瞻断言紧接在该位置之后的是单词字符,并将这些字符捕获到组1.匹配成功,组1包含
BCD
。引擎移动到字符串中的下一个位置,然后
CD
然后D
重复该过程。
所以,使用
(?=(~[^\s~]+~))
请参阅regex demo
模式(?=(~[^\s~]+~))
会检查字符串中的每个位置并搜索~
,然后搜索除空白和~
以外的1 +个字符,然后搜索另一个~
。由于仅在检查位置后移动索引,而不是在捕获值时移动索引,因此会提取重叠的子字符串。
import re
p = re.compile(r'(?=(~[^\s~]+~))')
test_str = " ~*_abc~xyz~ ~123~"
print(p.findall(test_str))
# => ['~*_abc~', '~xyz~', '~123~']
答案 1 :(得分:-1)