2015-03-13 182 views
1

我想在字符串中的最后一个小写字母处拆分字符串。字符串将总是至少有一个小写字母。在最后一个小写字母后面总会有一个空格。字符串中可能有数字。Python:在最后一个小写字母处拆分字符串

这是我想出来的最好的:

s = 'Arrived at location NEWARK NJ US' 
for i, c in enumerate(reversed(s)): 
    if c.islower(): 
     d = len(s) - i 
     break 
a = s[:d] 
b = s[d+1:] 

是否有一个更简单或更Python的方式?也许是一个可读的正则表达式?

回答

4

通过re.split

>>> s = 'Arrived at location NEWARK NJ US' 
>>> re.split(r'(?<=[a-z])\s+(?=[^a-z]*$)', s) 
['Arrived at location', 'NEWARK NJ US'] 
  • (?<=[a-z])为小写字母后,看起来。
  • \s+,那么符合下列一个或多个空格字符,
  • 只有
  • 它后面(?=..)
  • [^a-z]*任何字符,但一个小写字母,零次或多次的不是。
  • $紧接着一行结束。所以它与紧接在最后一个小写字母后面的空格相匹配。

OR

>>> s = "Arrived at location NEWARK NJ US" 
>>> part1, part2 = re.findall(r'(.*[a-z])\s+(.*)', s)[0] 
>>> part1 
'Arrived at location' 
>>> part2 
'NEWARK NJ US' 

OR

>>> s = "Arrived at location NEWARK NJ US" 
>>> part1, part2 = re.search(r'(.*[a-z])\s+(.*)', s).groups() 
>>> part1 
'Arrived at location' 
>>> part2 
'NEWARK NJ US' 

OR

re.split将返回定界符如果分隔符是一个捕获GR内本牛津大学出版社。

>>> part1, part2 = [i for i in re.split(r'(.*[a-z])\s+', s) if not i == ''] 
>>> part1 
'Arrived at location' 
>>> part2 
'NEWARK NJ US' 
+0

可读在旁观者:-) – foosion 2015-03-13 11:32:53

+0

@foosion的眼睛:那是正则表达式为您服务。 – 2015-03-13 11:34:20

+0

@MartijnPieters也许我应该在Q中说“简单的正则表达式”,但你可能会给出相同的评论。 :-) – foosion 2015-03-13 11:36:32

4

关于什么:

s = 'Arrived at location NEWARK NJ US' 
pos = re.search("[a-z]", s[::-1]).start() 
a, b = s[:-pos], s[1 - pos:] 

结果为ab

Arrived at location 
NEWARK NJ US 

的想法是通过搜索字符串逆转找到最后小写字母的位置。

如果你希望最后一个小写字母后的多个空格:

start, end = re.search("\s+[a-z]", s[::-1]).span() 
a, b = s[:1 - end], s[-start:] 
+2

比Avinash的答案更可读 – foosion 2015-03-13 11:57:27

+1

@foosion检查我的更新.. – 2015-03-13 12:28:26