Python中的字符范围

有没有办法来区分字符? 像这样的东西。

for c in xrange( 'a', 'z' ): print c 

我希望你们能帮忙

这对自定义生成器非常有用:

 def char_range(c1, c2): """Generates the characters from `c1` to `c2`, inclusive.""" for c in xrange(ord(c1), ord(c2)+1): yield chr(c) 

然后:

 for c in char_range('a', 'z'): print c 
 import string for char in string.ascii_lowercase: print char 

对于其他可能性,请参阅string常量 ,包括大写字母,数字,区域依赖字符,如果您想要多个集合中的所有字符,则可以像string.ascii_uppercase + string.ascii_lowercase一样string.ascii_uppercase + string.ascii_lowercase所有这些字符连接在一起。

您必须将字符转换为数字,然后再返回。

 for c in xrange(ord('a'), ord('z')+1): print chr(c) # resp. print unicode(c) 

为了美观和可读性,你可以把它包装在一个生成器中:

 def character_range(a, b, inclusive=False): back = chr if isinstance(a,unicode) or isinstance(b,unicode): back = unicode for c in xrange(ord(a), ord(b) + int(bool(inclusive))) yield back(c) for c in character_range('a', 'z', inclusive=True): print(chr(c)) 

可以使用inclusive=False (默认)来调用这个生成器来模仿Python的平常bhehaviour来排除结束元素,或者用inclusive=True (默认)来包含它。 因此,使用默认inclusive=False'a', 'z'将跨越从ay的范围,不包括z

如果ab中的任何a是unicode,则它以unicode返回结果,否则使用chr

它目前(可能)只适用于Py2。

还有其他好的答案(我个人可能会使用string.lowercase),但为了完整起见,可以使用小写ascii值的map()和chr() :

 for c in map(chr, xrange(97, 123)): print c 
 for character in map( chr, xrange( ord('a'), ord('c')+1 ) ): print character 

打印:

 a b c 
 # generating 'a to z' small_chars. small_chars = [chr(item) for item in range(ord('a'), ord('z')+1)] # generating 'A to Z' upper chars. upper_chars = [chr(item).upper() for item in range(ord('a'), ord('z')+1)] 

如果你有一个简短的固定的字符列表,只要使用Python的string作为列表就可以了。

 for x in 'abcd': print x 

要么

 [x for x in 'abcd'] 

从上面的post启发,我想出了这个:

 map(chr,range(ord('a'),ord('z')+1)) 

我喜欢这样的方法:

 base64chars = list(chars('AZ', 'az', '09', '++', '//')) 

它当然可以用更多的舒适来实现,但它快速简单,可读性强。

Python 3

发电机版本:

 def chars(*args): for a in args: for i in range(ord(a[0]), ord(a[1])+1): yield chr(i) 

或者,如果您喜欢列表parsing:

 def chars(*args): return [chr(i) for a in args for i in range(ord(a[0]), ord(a[1])+1)] 

第一个收益率:

 print(chars('ĀĈ')) <generator object chars at 0x7efcb4e72308> print(list(chars('ĀĈ'))) ['Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ'] 

而第二个产量:

 print(chars('ĀĈ')) ['Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ'] 

这真的很方便:

 base64chars = list(chars('AZ', 'az', '09', '++', '//')) for a in base64chars: print(repr(a),end='') print('') for a in base64chars: print(repr(a),end=' ') 

输出

 'A''B''C''D''E''F''G''H''I''J''K''L''M''N''O''P''Q''R''S''T''U''V''W''X''Y''Z''a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''s''t''u''v''w''x''y''z''0''1''2''3''4''5''6''7''8''9''+''/' 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '+' '/' 

为什么list() ? 没有base64chars可能会成为一个生成器(取决于您select的实现),因此只能在第一个循环中使用。

Python 2

类似的可以用Python 2进行存档。但是如果你想支持Unicode也要复杂得多。 为了鼓励你停止使用Python 2来支持Python 3,我不打算在这里提供Python 2的解决scheme;)

尝试避免Python 2今天的新项目。 在扩展它们之前,也要尝试将旧的项目移植到Python 3 – 从长远来看,这将是值得的!

在Python 2中正确处理Unicode是非常复杂的,如果从一开始就不支持这种支持,那么几乎不可能为Python 2项目添加Unicode支持。

提示如何将其恢复到Python 2:

  • 使用xrange而不是range
  • 创build第二个函数( unicodes ?)来处理Unicode:
    • 使用unichr而不是chr来返回unicode而不是str
    • 永远不要忘记提供unicodestring作为args ,使ord和数组下标正常工作

使用“在范围内计数”和CHR&ORD:

 print [chr(ord('a')+i) for i in range(ord('z')-ord('a'))] 

使用@ ned-batchelder的答案在这里,我正在修改python3

 def char_range(c1, c2): """Generates the characters from `c1` to `c2`, inclusive.""" """Using range instead of xrange as xrange is deprecated in Python3""" for c in range(ord(c1), ord(c2)+1): yield chr(c) 

然后就像奈德的回答一样:

 for c in char_range('a', 'z'): print c 

谢谢Ned!

另一个选项(像范围一样操作 – 如果你想停止包含,则加1来停止)

 >>> import string >>> def crange(arg, *args): ... """character range, crange(stop) or crange(start, stop[, step])""" ... if len(args): ... start = string.ascii_letters.index(arg) ... stop = string.ascii_letters.index(args[0]) ... else: ... start = string.ascii_letters.index('a') ... stop = string.ascii_letters.index(arg) ... step = 1 if len(args) < 2 else args[1] ... for index in range(start, stop, step): ... yield string.ascii_letters[index] ... >>> [_ for _ in crange('d')] ['a', 'b', 'c'] >>> >>> [_ for _ in crange('d', 'g')] ['d', 'e', 'f'] >>> >>> [_ for _ in crange('d', 'v', 3)] ['d', 'g', 'j', 'm', 'p', 's'] >>> >>> [_ for _ in crange('A', 'G')] ['A', 'B', 'C', 'D', 'E', 'F'] 

使用列表理解:

 for c in [chr(x) for x in range(ord('a'), ord('z'))]: print c