我在文本文件中有一个产品代码列表,每个产品代码都是如下产品代码:
abcd2343 abw34324 abc3243-23A
所以是字母后跟数字和其他字符。
我想分开第一次出现的数字。
答案 0 :(得分:40)
In [32]: import re
In [33]: s='abcd2343 abw34324 abc3243-23A'
In [34]: re.split('(\d+)',s)
Out[34]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A']
或者,如果您想在第一次出现数字时拆分:
In [43]: re.findall('\d*\D+',s)
Out[43]: ['abcd', '2343 abw', '34324 abc', '3243-', '23A']
\d+
匹配1位或更多位数。\d*\D+
匹配0位或更多位,后跟1位或更多位非数字。\d+|\D+
匹配1位或更多位或 1位或更多位非数字。有关Python正则表达式语法的更多信息,请参阅the docs。
re.split(pat, s)
将使用s
作为分隔符拆分字符串pat
。如果pat
以括号开头和结尾(以便成为“捕获组”),则re.split
也会返回与pat
匹配的子字符串。例如,比较:
In [113]: re.split('\d+', s)
Out[113]: ['abcd', ' abw', ' abc', '-', 'A'] # <-- just the non-matching parts
In [114]: re.split('(\d+)', s)
Out[114]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A'] # <-- both the non-matching parts and the captured groups
相比之下,re.findall(pat, s)
仅返回与s
匹配的pat
部分:
In [115]: re.findall('\d+', s)
Out[115]: ['2343', '34324', '3243', '23']
因此,如果s
以数字结尾,则可以使用re.findall('\d+|\D+', s)
代替re.split('(\d+)', s)
来避免以空字符串结尾:
In [118]: s='abcd2343 abw34324 abc3243-23A 123'
In [119]: re.split('(\d+)', s)
Out[119]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123', '']
In [120]: re.findall('\d+|\D+', s)
Out[120]: ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123']
答案 1 :(得分:1)
import re
m = re.match(r"(?P<letters>[a-zA-Z]+)(?P<the_rest>.+)$",input)
m.group('letters')
m.group('the_rest')
这涵盖了abc3243-23A的角落情况,并为字母组输出abc
,为the_rest
输出3243-23A
既然你说它们都在个别行上,你显然需要在input
答案 2 :(得分:1)
要分配第一个数字
parts = re.split('(\d.*)','abcd2343') # => ['abcd', '2343', '']
parts = re.split('(\d.*)','abc3243-23A') # => ['abc', '3243-23A', '']
所以这两个部分总是部分[0]和部分[1]。
当然,您可以将其应用于多个代码:
>>> s = "abcd2343 abw34324 abc3243-23A"
>>> results = [re.split('(\d.*)', pcode) for pcode in s.split(' ')]
>>> results
[['abcd', '2343', ''], ['abw', '34324', ''], ['abc', '3243-23A', '']]
如果每个代码都在一行中,则代替s.split( )
使用s.splitlines()
。
答案 3 :(得分:1)
此函数还处理浮点数和负数。
def separate_number_chars(s):
res = re.split('([-+]?\d+\.\d+)|([-+]?\d+)', s.strip())
res_f = [r.strip() for r in res if r is not None and r.strip() != '']
return res_f
例如:
utils.separate_number_chars('-12.1grams')
> ['-12.1', 'grams']
答案 4 :(得分:0)
def firstIntIndex(string):
result = -1
for k in range(0, len(string)):
if (bool(re.match('\d', string[k]))):
result = k
break
return result
答案 5 :(得分:0)
尝试此代码将可以正常工作
import re
text = "MARIA APARECIDA 99223-2000 / 98450-8026"
parts = re.split(r' (?=\d)',text, 1)
print(parts)
输出:
['MARIA APARECIDA','99223-2000 / 98450-8026']