python中字符的范围
有没有一种方法可以跨越字符范围?像这样的python中字符的范围,python,range,character,Python,Range,Character,有没有一种方法可以跨越字符范围?像这样的 for c in xrange( 'a', 'z' ): print c 希望你们能帮忙。你们必须把字符转换成数字,然后再转换回来 for c in xrange(ord('a'), ord('z')+1): print chr(c) # resp. print unicode(c) 为了美观和可读性,您可以将其包装在生成器中: def character_range(a, b, inclusive=False): back
for c in xrange( 'a', 'z' ):
print c
希望你们能帮忙。你们必须把字符转换成数字,然后再转换回来
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'
将仅跨越a
到y
的范围,不包括z
如果a
,b
中的任何一个是unicode,则返回unicode格式的结果,否则使用chr
它目前(可能)只在Py2中工作
import string
for char in string.ascii_lowercase:
print char
请参阅以了解其他可能性,包括大写、数字、与区域设置相关的字符,如果希望所有字符都包含在多个集合中,则所有这些字符都可以像
string.ascii\u大写+string.ascii\u小写那样连接在一起。
这对于自定义生成器非常有用:
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))
Python 2:
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)
然后:
Python 3:
def char_range(c1, c2):
"""Generates the characters from `c1` to `c2`, inclusive."""
for c in range(ord(c1), ord(c2)+1):
yield chr(c)
然后:
这里还有其他很好的答案(我个人可能会使用string.lowercase),但为了完整起见,您可以在小写ascii值上使用and:
for c in map(chr, xrange(97, 123)):
print c
印刷品:
a
b
c
如果您有一个固定的短字符列表,只需使用Python将字符串作为列表处理即可
for x in 'abcd':
print x
或
使用“范围内计数”和chr&ord:
print [chr(ord('a')+i) for i in range(ord('z')-ord('a'))]
使用列表理解:
for c in [chr(x) for x in range(ord('a'), ord('z'))]:
print c
受上面这篇文章的启发,我提出了以下建议:
map(chr,range(ord('a'),ord('z')+1))
在这里使用@ned Batcheld的答案,我对它进行了一点修改,用于
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
谢谢你,内德 另一个选项(操作类似于范围-如果希望停止包含,则添加1停止)
导入字符串
>>>def起重机(参数,*参数):
... “”“字符范围、字距(停止)或字距(开始、停止[,步骤]””
... 如果len(args):
... start=string.ascii_letters.index(arg)
... stop=string.ascii_letters.index(args[0])
... 其他:
... start=string.ascii_letters.index('a'))
... stop=string.ascii_letters.index(arg)
... 如果len(args)<2个else args[1],则步骤=1
... 对于范围内的索引(开始、停止、步骤):
... 产生字符串。ascii_字母[索引]
...
>>>[uu代表uu在起重机中('d')]
['a','b','c']
>>>
>>>[uu代表uu在起重机中('d','g')]
['d','e','f']
>>>
>>>[uu代表起重机中的('d','v',3)]
[d',g',j',m',p',s']
>>>
>>>[uu代表起重机中的uu('A','G')]
['A','B','C','D','E','F']
我喜欢这样一种方法:
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)
或者,如果您喜欢列表理解:
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('ĀĈ')))
['Ā', 'ā', 'Ă', 'ă', 'Ą', 'ą', 'Ć', 'ć', 'Ĉ']
这真的很方便:
base64chars = list(chars('AZ', 'az', '09', '++', '//'))
for a in base64chars:
print(repr(a),end='')
print('')
for a in base64chars:
print(repr(a),end=' ')
import re
import string
re.findall("[a-f]", string.printable)
# --> ['a', 'b', 'c', 'd', 'e', 'f']
re.findall("[n-qN-Q]", string.printable)
# --> ['n', 'o', 'p', 'q', 'N', 'O', 'P', 'Q']
输出
'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' '+' '/'
为什么使用列表()
?如果没有base64chars,则可能成为生成器(取决于您选择的实现),因此只能在第一个循环中使用
Python 2
类似的文件可以用Python 2存档。但是,如果您也想支持Unicode,那么它要复杂得多。为了鼓励您停止使用Python2,转而使用Python3,我不想在这里提供Python2解决方案;)
对于新项目,现在尽量避免使用Python2。在扩展之前,也要先尝试将旧项目移植到Python3——从长远来看,这是值得的
在Python2中正确处理Unicode是极其复杂的,如果从一开始就没有内置Unicode支持,那么几乎不可能为Python2项目添加Unicode支持
提示如何将其向后移植到Python 2:
- 使用
xrange
而不是range
- 创建用于处理Unicode的第二个函数(
unicodes
?):
- 使用
unichr
而不是chr
返回unicode
而不是str
- 永远不要忘记将
unicode
字符串作为args
输入,以使ord
和数组下标正常工作
我也有同样的需求,我使用了这个:
chars = string.ascii_lowercase
range = list(chars)[chars.find('a'):chars.find('k')+1]
希望这将有助于某人根据字符范围的复杂程度,正则表达式可能比较方便:
base64chars = list(chars('AZ', 'az', '09', '++', '//'))
for a in base64chars:
print(repr(a),end='')
print('')
for a in base64chars:
print(repr(a),end=' ')
import re
import string
re.findall("[a-f]", string.printable)
# --> ['a', 'b', 'c', 'd', 'e', 'f']
re.findall("[n-qN-Q]", string.printable)
# --> ['n', 'o', 'p', 'q', 'N', 'O', 'P', 'Q']
这解决了ASCII表中数字、大写字母和小写字母之间意外包含标点符号的麻烦问题。对于大写字母:
for i in range(ord('A'), ord('Z')+1):
print(chr(i))
对于小写字母:
for i in range(ord('a'), ord('z')+1):
print(chr(i))
如果你只想要英文字母表,有导入字符串
,字符串.ascii\u小写字母
。你可以将其隐藏在生成器中:看我的答案。你是说你更喜欢ord和chr在你脸上?如果你不止一次这样做,你会在每个地方复制它吗?奇怪…所以我最好说“那看起来更好”而不是“这看起来更好”。真漂亮!对于任何要复制它的人,请记住范围(1,3)迭代值1和2(而不是3),但是char_range('a','c')将迭代'a','b'和'c'!您也可以添加可选的步骤参数:def char\u范围(c1,c2,步骤=1)
<代码>顺序(c1),顺序(c2)+1,步骤
@wjandrea,不太适用于负步骤,例如字符范围('g','a',-1)
给出了['g','f','e','d','c']
@alan尼斯catch!看起来这是ord(c2)
上+1的故障。因此,将ord(c2)+1
替换为ord(c2)+(如果步骤>0,则为1,否则为-1)
。虽然为了清晰起见,您可能希望将其排除在range()调用之外。但这样做的问题是,要生成a-z,您需要知道哪个字符位于z之后。不是特别舒服。或许最好避免使用“范围”这个名称(改用closedrange或inclusiverange?)这是一个好主意,对我的a
chars = string.ascii_lowercase
range = list(chars)[chars.find('a'):chars.find('k')+1]
import re
import string
re.findall("[a-f]", string.printable)
# --> ['a', 'b', 'c', 'd', 'e', 'f']
re.findall("[n-qN-Q]", string.printable)
# --> ['n', 'o', 'p', 'q', 'N', 'O', 'P', 'Q']
for i in range(ord('A'), ord('Z')+1):
print(chr(i))
for i in range(ord('a'), ord('z')+1):
print(chr(i))