我想找到两个~s 之间包含的所有可能出现的文本.
例如:对于文本~*_abc~xyz~ ~123~,我希望以下表达式作为匹配模式:
~*_abc~~xyz~~123~注意它可以是字母或数字.
我尝试使用正则表达式,~[\w]+?~但它没有给我~xyz~.我想~重新考虑一下.但我不想只是~~一场可能的比赛.
有时,您需要在同一个单词中进行多次匹配.举例来说,假设从一个字符串,如
ABCD要提取ABCD,BCD,CD和D.你可以用这个正则表达式做到这一点:
(?=(\w+))在字符串中的第一个位置(在此之前
A),引擎启动第一次匹配尝试.前瞻断言紧接在当前位置之后的是一个或多个单词字符,并将这些字符捕获到组1.前瞻成功,匹配尝试也是如此.由于模式不匹配任何实际字符(前瞻仅查看),引擎返回零宽度匹配(空字符串).它还返回第1组捕获的内容:ABCD然后引擎移动到字符串中的下一个位置并开始下一个匹配尝试.此外,先行断言什么紧跟这一立场是单词字符,并捕捉这些字符为1组匹配成功,以及1组包含
BCD.发动机移动到字符串中的下一位置,并且重复该过程本身
CD然后D.
所以,使用
(?=(~[^\s~]+~))
Run Code Online (Sandbox Code Playgroud)
请参阅正则表达式演示
模式(?=(~[^\s~]+~))检查字符串中的每个位置,~然后搜索除了空白之外的1+个字符~,然后跟随另一个字符~.由于仅在检查位置后移动索引,而不是在捕获值时移动索引,因此将提取重叠的子串.
import re
p = re.compile(r'(?=(~[^\s~]+~))')
test_str = " ~*_abc~xyz~ ~123~"
print(p.findall(test_str))
# => ['~*_abc~', '~xyz~', '~123~']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
184 次 |
| 最近记录: |