python字符串的分割,python字符串分割成单个字母

  python字符串的分割,python字符串分割成单个字母

  在给定的字符集出现之前拆分字符串的pythonic方法是什么?

  例如,我想分裂

  “漫长而曲折的道路”

  当大写字母出现时(也许除了首字母),得到

  [The , Long , And , Winding , Road].

  编辑:它还应该分割单个事件,即

  我想从“ABC”得到它

  [甲,乙,丙].

  不幸的是,在Python中不可能分割成零宽度的匹配。但是您可以使用re.findall来代替:

  进口re

  re.findall([A-Z][^A-Z]*,《漫长而黑暗的道路》

  [The , Long , And , Winding , Road]

  re.findall([A-Z][^A-Z]*,“ABC”)

  [A , B , C]

  请注意,这将删除第一个大写字母之前的所有字符。这条长长的弯弯曲曲的路通向

  @MarcSchulder:如果需要这种情况,就用[a-za-z] [a-z] *作为正则表达式。

  不使用大写字母也能进行同样的操作吗?

  要拆分小写驼峰字打印(re。查找全部([a-z] [a-z] [a-z] *,longandwindingroad))

  这是另一个正则表达式解决方案。你可以把问题改写成‘拆分前,如何在每个大写字母前插入一个空格’:

  s= thelongandwinding road ABC a123b 45

  re(r ([A-Z]),r \1 ,s)。拆分()

  [The , Long , And , Winding , Road , A , B , C , A123 , B45]

  这样做的好处是,所有非空白字符都会保留,而大多数其他解决方案则不会。

  能解释一下1前的空格为什么起作用吗?是因为split方法还是和正则表达式有关?

  进口re

  re.findall([A-Z][a-z]* , TheLongAndWindingRoad )

  [The , Long , And , Winding , Road]

  re.findall([A-Z][a-z]*, SplitAString )

  [Split , A , String]

  re.findall([A-Z][a-z]*, ABC )

  [A , B , C]

  如果要将 ItsATest 拆分成[Its , A , Test],请将rexeg改为[A-Z][a-z]*

  1:让ABC先工作。Ive现在也更新了我的回答。

  Re.findall([A-Z] [a-z] *,占经济的70%左右)-[IT,经济]

  @ChristopheD .OP没说怎么处理非字母字符。

  没错,但是这个当前的正则表达式也会删除所有不以大写字母开头的正则(纯Alpha)单词。我怀疑这就是《任择议定书》的意图。

  @ Christopher解决方案的变体

  s=TheLongAndWindingRoad

  pos=[i for i,e in enumerate(s A )if e . I supper()]

  parts=[s[pos[j]:pos[j 1]]for j in x range(len(pos)-1)]

  打印零件

  一个很好的例子——也适用于非拉丁字符。这里显示的正则表达式解决方案没有。

  进口re

  过滤器(无,re.split(([a-z][^a-z]*),thelongandwindingroad))

  或者

  【s在re.split(([a-z][^a-z]*),thelongandwindingroad代表s)如果s】

  过滤器完全没有必要,正则表达式可以通过捕捉组直接拆分成任何东西: show [a-z] *))。split( thelongandwindingroad )if s]给出[the [The,Long,And,Winding,Road]]

  @ smci:filter的这种用法和对有条件列表的理解是一样的。你有什么异议吗?

  我知道我可以用一个有条件理解的列表来代替,因为我只是发布了代码,然后你就复制了。最好用以下三个理由来理解list comprehension: a)清晰易懂的成语:list comprehension是一个更Python的成语,它比filter(lambdaconditionfunc,)从左往右读。b)在Python 3中,filter()返回一个迭代器。因此,它们不会完全等同。c)希望filter()也慢。

  src=TheLongAndWindingRoad

  glue=

  结果=“”。join(glue x if x . I supper()else x for x in src)。长条(胶水)。拆分(粘合)

  能不能补充一个解释,说明为什么这是解决问题的好办法。

  很抱歉我忘了最后一步。

  在我看来,言简意赅,简明易懂。

  解决方案(如果你不喜欢显式正则表达式):

  s=TheLongAndWindingRoad

  pos=[i for i,e in enumerate(s) if e.isupper()]

  零件=[]

  对于xrange中的j(len(pos)):

  尝试:

  parts.append(s[pos[j]:pos[j 1]])

  除了索引错误:

  parts.append(s[pos[j]:])

  打印零件

  提前使用:

  在Python 3.7中,您可以执行以下操作:

  re.split((?=[A-Z]), theLongAndWindingRoad )

  它产生:

  [The , Long , And , Winding , Road]

  使用more_itertools.split_before工具可以做到这一点。

  将更多_itertools作为麻省理工学院导入

  iterable= TheLongAndWindingRoad

  [.在mit.split_before(iterable,pred=lambda s: s.isupper())中为我加入]

  # [The , Long , And , Winding , Road]

  它还应该拆分单个事件,即从“ABC”中获取[“甲”、“乙”、“丙]].

  iterable=ABC

  [.在mit.split_before(iterable,pred=lambda s: s.isupper())中为我加入]

  # [A , B , C]

  更多_itertools是带有60多种有用工具的第三方程序包,其中包括所有原始循环器配方的实现,从而避免了它们的手动实现。

  另一个没有正则表达式,并且如果需要,可以保持连续的大写

  def split_on_uppercase(s,keep_contiguous=False):

  参数:

  s (str):字符串

  保持连续(布尔值):表示我们希望

  将连续的大写字符放在一起

  退货:

  字符串长度=长度

  is_lower_around=(lambda: s[i-1].islower()或

  字符串长度(i 1)和s[i 1].islower())

  开始=0

  零件=[]

  对于范围内的I(1,string_length):

  如果s[i].isupper()和(不保持连续)或is_lower_around()):

  parts.append(s[start: i])

  开始=我

  parts.append(s[start:])

  退回零件

  split _ on _ upper case( theLongWindingRoad )

  [the , Long , Winding , Road]

  split _ on _ upper case( TheLongWindingRoad )

  [The , Long , Winding , Road]

  split _ on _ upper case( thelongwindingroad ,True)

  [The , Long , WINDING , Road , T]

  拆分开大写(“ABC”)

  [A , B , C]

  split_on_uppercase(ABCD ,True)

  [ABCD]

  split_on_uppercase( )

  []

  split _ on _ upper case("hello world ")

  [你好,世界]

  计算机编程语言方式可能是:

  .join([( I if I . is upper()else I)for I in TheLongAndWindingRoad ]).剥离()。拆分()

  [The , Long , And , Winding , Road]

  适用于Unicode,避免re/re2。

  .在]).加入([( i if i.isupper() else i) for i剥离()。拆分()

  [, , , ]

  分享我阅读帖子时想到的内容。与其他职位不同。

  strs=TheLongAndWindingRoad

  #抓取潜艇用热中子反应堆(submarine thermal reactor的缩写)中大写字母的索引

  start_idx=[i for i,j in enumerate(strs)if j . I super()]

  #创建空列表

  strs_list=[]

  #启动计数器

  cnt=1

  对于start_idx中的位置:

  start_pos=pos

  #使用计数器抓取下一个位置元素并忽略指数误差

  尝试:

  end_pos=start_idx[cnt]

  除了索引错误:

  继续

  #追加到空列表

  strs _ list。追加(strs[开始位置:结束位置])

  cnt=1

  使用列举和isupper()的替代方法

  码:

  strs=TheLongAndWindingRoad

  ind=0

  计数=0

  new_lst=[]

  对于index,val in enumerate(strs[1:],1):

  if val.isupper():

  new_lst.append(strs[ind:索引])

  ind=索引

  如果找到

  new_lst.append(strs[ind:])

  打印新列表

  输出:

  [The , Long , And , Winding , Road]

  不使用正则表达式或枚举的另一种方法:

  word=TheLongAndWindingRoad

  list=[x for x in word]

  对于列表中的字符:

  如果夏尔!=列表[0]和char.isupper():

  list[list.index(char)]= char

  fin_list=" " .加入(列表)。拆分("")

  我认为这无需链接太多方法或使用难以理解的长列表理解就更清楚,更简单。

  将给定的每个大写字母我替换为一个空格加上该字母我是。我们可以使用列表理解来做到这一点,或者我们可以如下定义一个函数来做到这一点。

  s=漫长而曲折的道路ABC a123b 45

  .join([char if (char.islower()或不是char。列表中的字符是否为alpha())else char].剥离()。拆分()

  [The , Long , A , N , D , Winding , Road , A , B , C , A123 , B45]

  如果您选择按功能执行,则方法如下。

  def splitAtUpperCase(文本):

  结果=

  对于文本中字符:

  if char.isupper():

  result= char

  否则:

  结果=字符

  返回result.split()

  在给定示例的情况下:

  print(splitatupper case( TheLongAndWindingRoad ))

  [The , Long , A , N , D , Winding , Road]

  但在大多数情况下,当我们将一个句子拆分成大写字母时,通常情况下我们希望保留缩写,缩写通常是一个连续的大写字母流。下面的代码会有所帮助。

  定义拆分大小写:

  对于范围内的I(len(s)-1)[:-1]:

  如果s[i]。isupper()和s[i 1]。islower():

  s=s[:i] s[i:]

  如果s[i]。isupper()和s[i-1]。islower():

  s=s[:i] s[i:]

  return s.split()

  splitatupper case(“TheLongANDWindingRoad”)

  [The , Long , AND , Winding , Road]

  谢谢你。

  @MarkByers我不知道为什么有人不同意我的回答,但我希望你能帮我看一看。非常感谢您的反馈。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: