我有一个文本文件里面记录了一些产品代码,每行一个,格式如下:
abcd2343 abw34324 abc3243-23A
所以它们由字母、数字和其他字符组成。
我想要在第一个数字出现的地方进行分割。
import re
s='abcd2343 abw34324 abc3243-23A'
re.split('(\d+)',s)
> ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A']
或者,如果您想在第一个数字出现时进行分割:
re.findall('\d*\D+',s)
> ['abcd', '2343 abw', '34324 abc', '3243-', '23A']
\d+
匹配1个或多个数字。\d*\D+
匹配0个或多个数字后跟1个或多个非数字字符。\d+|\D+
匹配1个或多个数字 或 1个或多个非数字字符。查看文档,了解有关Python正则表达式语法的更多信息。
re.split(pat, s)
会使用pat
作为分隔符拆分字符串s
。如果pat
以括号开头和结尾(从而成为“捕获组”),那么re.split
还将返回与pat
匹配的子字符串。例如比较:
re.split('\d+', s)
> ['abcd', ' abw', ' abc', '-', 'A'] # <-- just the non-matching parts
re.split('(\d+)', s)
> ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A'] # <-- both the non-matching parts and the captured groups
相比之下,re.findall(pat, s)
仅返回与pat
匹配的s
部分:
re.findall('\d+', s)
> ['2343', '34324', '3243', '23']
因此,如果 s
以数字结尾,您可以使用 re.findall('\d+|\D+', s)
而不是使用 re.split('(\d+)', s)
来避免以空字符串结尾:
s='abcd2343 abw34324 abc3243-23A 123'
re.split('(\d+)', s)
> ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123', '']
re.findall('\d+|\D+', s)
> ['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23', 'A ', '123']
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']
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
作为字母组,而将 3243-23A 输出为 the_rest
由于你说他们都在单独行上,因此显然需要将每一行放入 input
中
def firstIntIndex(string):
result = -1
for k in range(0, len(string)):
if (bool(re.match('\d', string[k]))):
result = k
break
return result
根据第一位数字进行分区
parts = re.split('(\d.*)','abcd2343') # => ['abcd', '2343', '']
parts = re.split('(\d.*)','abc3243-23A') # => ['abc', '3243-23A', '']
因此,这两个部分始终是parts [0]和parts [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.splitlines()
替代 s.split( )
。import re
text = "MARIA APARECIDA 99223-2000 / 98450-8026"
parts = re.split(r' (?=\d)',text, 1)
print(parts)
输出:
['MARIA APARECIDA','99223-2000 / 98450-8026']
re.findall('(\d+|\D+)', 'abcd2343 abw34324 abc3243-23')
,它将返回['abcd', '2343', ' abw', '34324', ' abc', '3243', '-', '23']
。 - unutbu