假设我有一个由任何符号组成的文本,例如:
string = 1234abdchdj星期上午十时*&()
我想找到带有正则表达式的字符二元组,以获得类似的输出:
12, 23, 34, ab, bd, ...
我实际上是在使用python
和regex
的以下内容:
bigrams = re.findall('(?=(\S\S))', string)
但这会给我错误的输出,因为它会遗漏字符,实际上给了我所需的二元语法的一半:
12, 34, ab, dc, ...
希望我已经很清楚了,谢谢您
答案 0 :(得分:2)
另一种替代方法是使用zip
,这可能是执行此操作最有效的方法。
string = "1234abdchdj星期上午十时*&()"
for a, b in zip(string, string[1:]):
print(a, b)
根据您要对最后一个字符)
进行的操作,您还可以使用zip_longest
:
from itertools import zip_longest
for a, b in zip_longest(string, string[1:], fillvalue="-"):
print(a, b)
将与在末尾添加包含) -
的行之前打印相同的内容。
如果您需要节省一些内存,甚至可以使用islice
:
from itertools import islice
string = "1234abdchdj星期上午十时*&()"
for a, b in zip(string, islice(string, 1, None)):
print(a, b)
经典切片[1:]
创建第二个数组,同时在同一数组上创建迭代器。但是除非您确实需要保存此内存,否则我会坚持使用string[1:]
。
答案 1 :(得分:1)
您可以尝试:
s = 'abcdef'
for i in range(len(s)-1):
print(s[i:i+2])
甚至更好:
s = 'abcdef'
a = ''
for b in s:
if a:
print(a+b)
a = b
答案 2 :(得分:1)
如果不是不可能的话,这将很困难,因为您正试图使用正则表达式来解决本不打算解决的问题。您可以在一行Python中非常干净地完成此操作。
ans = [x[i:i+2] for i in range(0, len(x)-1, 2)]