如果字符出现在某个“标记”字符之前或之后,我想查找它们中的字符。
所以我的标记是-
,字符串是"a b-c d"
。我想依次找到b
和c
。
我尝试过
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']
,这是更好的方法,但是我仍然必须对该结果进行后处理才能获得单个字符b
和c
。
有没有针对该问题的一站式解决方案?
修改
后续问题:字符串为"a b-c-d e"
,我想获取类似[('','a',''), ('','b','-'), ('-','c','-'), ('-','d',''), ('','e','')]
的内容
我觉得这个问题太多了。
答案 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', '')]
请参见regex和Python demos。
这里的问题是,您希望重叠的字符串在不同的迭代中得到匹配,但是如果发生匹配,则跳过某些位置。
主要模式是可选连字符-整个单词char -可选连字符。但是,它应该匹配正则表达式索引并将其扩展到下一个字符,或者如果不是连字符,则将其扩展到下一个字符之后的下一个字符(否则,将获得预期的更多结果)。
详细信息
(?=(-?)\b([a-z])\b(-?)\b)
-不消耗文本的积极前瞻,并且与紧随其后的位置匹配
(-?)
-第1组:可选的-
\b
-单词边界([a-z])
-第2组:小写字母\b
-单词边界(-?)
-第3组:可选的-
.
-除换行符以外的任何字符[^-]?
-除-
以外的1或0个字符。由于re.findall
的工作原理,输出仅包含捕获的字符串。