我可以在下一组正则表达式中“重用”一个字符吗?

时间:2018-07-12 02:15:03

标签: python regex

如果字符出现在某个“标记”字符之前或之后,我想查找它们中的字符。

所以我的标记是-,字符串是"a b-c d"。我想依次找到bc

我尝试过

re.findall(r'(-[a-z]|[a-z]-)','a b-c d')

显然只能得到

['b-']

我也尝试过

re.findall(r'([a-z]-[a-z])','a b-c d')

我得到结果

['b-c']

,这是更好的方法,但是我仍然必须对该结果进行后处理才能获得单个字符bc

有没有针对该问题的一站式解决方案?

修改

后续问题:字符串为"a b-c-d e",我想获取类似[('','a',''), ('','b','-'), ('-','c','-'), ('-','d',''), ('','e','')]的内容

我觉得这个问题太多了。

2 个答案:

答案 0 :(得分:2)

更多组。

>>> re.findall(r'(([a-z])-([a-z]))','a b-c d')
[('b-c', 'b', 'c')]

由于您实际上并不在意原始内容...

>>> re.findall(r'([a-z])-([a-z])','a b-c d')
[('b', 'c')]

答案 1 :(得分:1)

  

字符串是"a b-c-d e",我想得到类似[('','a',''), ('','b','-'), ('-','c','-'), ('-','d',''), ('','e','')]

您可以使用

import re
s='a b-c-d e'
print (re.findall(r'(?=(-?)\b([a-z])\b(-?)).[^-]?', s))
# => [('', 'a', ''), ('', 'b', '-'), ('-', 'c', '-'), ('-', 'd', ''), ('', 'e', '')]

请参见regexPython demos

这里的问题是,您希望重叠的字符串在不同的迭代中得到匹配,但是如果发生匹配,则跳过某些位置。

主要模式是可选连字符-整个单词char -可选连字符。但是,它应该匹配正则表达式索引并将其扩展到下一个字符,或者如果不是连字符,则将其扩展到下一个字符之后的下一个字符(否则,将获得预期的更多结果)。

详细信息

  • (?=(-?)\b([a-z])\b(-?)\b)-不消耗文本的积极前瞻,并且与紧随其后的位置匹配
    • (-?)-第1组:可选的-
    • \b-单词边界
    • ([a-z])-第2组:小写字母
    • \b-单词边界
    • (-?)-第3组:可选的-
  • .-除换行符以外的任何字符
  • [^-]?-除-以外的1或0个字符。

由于re.findall的工作原理,输出仅包含捕获的字符串。