我想在字符串中的最后一个小写字母处拆分一个字符串。字符串将始终至少有一个小写字母。最后一个小写字母后总会有一个空格。字符串中可能有数字。
这是我想出的最好的:
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:]
有没有更简单或更pythonic的方法?也许是一个可读的正则表达式?
怎么样:
s = 'Arrived at location NEWARK NJ US'
pos = re.search("[a-z]", s[::-1]).start()
a, b = s[:-pos], s[1 - pos:]
a
, b
的结果:
Arrived at location
NEWARK NJ US
这个想法是通过搜索反转的字符串来找到最后一个小写字母的位置。
如果您希望最后一个小写字母后有多个空格:
start, end = re.search("s+[a-z]", s[::-1]).span()
a, b = s[:1 - end], s[-start:]
通过 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]*
任何字符,但不是小写字母,零次或多次。 -
$
紧接着是队伍的尽头。因此,它与最后一个小写字母之后的空格匹配。
或
>>> 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'
或
>>> 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'
或
如果分隔符存在于捕获组中,则 re.split 将返回分隔符。
>>> part1, part2 = [i for i in re.split(r'(.*[a-z])s+', s) if not i == '']
>>> part1
'Arrived at location'
>>> part2
'NEWARK NJ US'