任何字符二元语法的正则表达式

时间:2019-04-11 20:47:20

标签: python regex

假设我有一个由任何符号组成的文本,例如:

string = 1234abdchdj星期上午十时*&()

我想找到带有正则表达式的字符二元组,以获得类似的输出:

12, 23, 34, ab, bd, ...

我实际上是在使用pythonregex的以下内容:

bigrams = re.findall('(?=(\S\S))', string)

但这会给我错误的输出,因为它会遗漏字符,实际上给了我所需的二元语法的一半:

12, 34, ab, dc, ...

希望我已经很清楚了,谢谢您

3 个答案:

答案 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)]