Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中字符的范围_Python_Range_Character - Fatal编程技术网

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))