拆分字符串,直到在 python 中找到 5-7 位数字
split string until a 5-7 digit number is found in python
我有如下字符串:
1338516 -...pair - 5pk 1409093 -...re Wax 3Pk
1409085 -...dtnr - 5pk 1415090 -...accessories
490663 - 3 pack 1490739 -...2 - 3 pack
我想做的是,拆分这些字符串,使第一个字符串为 1338516 -...pair - 5pk
,第二个字符串为 1409093 -...re Wax 3Pk
。
目前,我可以使用以下代码提取数字:
list(filter(lambda k: '...' in k, reqText))
lst1 = ''.join(lst)
numbers = re.findall(r'\d+', lst1)
numbers1 = [x for x in numbers if len(x) > 3]
有什么建议吗?
您可以使用带有模式的拆分:
[^\S\n]+(?=\d{5,7}\b)
说明
[^\S\n]+
匹配 1 个或多个没有换行符的空格
(?=\d{5,7}\b)
正面前瞻,断言右侧 5-7 位数字后跟一个单词边界
import re
pattern = r"[^\S\n]+(?=\d{5,7}\b)"
lst = [
"1338516 -...pair - 5pk 1409093 -...re Wax 3Pk",
"1409085 -...dtnr - 5pk 1415090 -...accessories",
"490663 - 3 pack 1490739 -...2 - 3 pack"
]
for s in lst:
print(re.split(pattern, s))
输出
['1338516 -...pair - 5pk', '1409093 -...re Wax 3Pk']
['1409085 -...dtnr - 5pk', '1415090 -...accessories']
['490663 - 3 pack', '1490739 -...2 - 3 pack']
另一种选择可能是匹配方法:
\b\d{5,7}\b.*?(?=[^\S\n]+\d{5,7}\b|$)
您可以使用
^(.+?)\s*\b(\d{5,7}\b.*)
参见regex demo。
在 Python 中,使用原始字符串文字来声明此正则表达式:
pattern = r'^(.+?)\s*\b(\d{5,7}\b.*)'
详情:
^
- 字符串开头
(.+?)
- 第 1 组:出现一次或多次(但尽可能少)除换行符以外的任何字符
\s*
- 零个或多个空格
\b
- 单词边界
(\d{5,7}\b.*)
- 第 2 组:five-seven 数字、字边界和该行的其余部分。
看到一个Python demo:
import re
text = "1338516 -...pair - 5pk 1409093 -...re Wax 3Pk"
pattern = r'^(.+?)\s*\b(\d{5,7}\b.*)'
m = re.search(pattern, text)
if m:
print(m.group(1)) # => 1338516 -...pair - 5pk
print(m.group(2)) # => 1409093 -...re Wax 3Pk
如果你需要在Pandas数据框中使用它,你可以使用
df[['result_col_1', 'result_col_2']] = df['source'].str.extract(pattern, expand=True)
我有如下字符串:
1338516 -...pair - 5pk 1409093 -...re Wax 3Pk
1409085 -...dtnr - 5pk 1415090 -...accessories
490663 - 3 pack 1490739 -...2 - 3 pack
我想做的是,拆分这些字符串,使第一个字符串为 1338516 -...pair - 5pk
,第二个字符串为 1409093 -...re Wax 3Pk
。
目前,我可以使用以下代码提取数字:
list(filter(lambda k: '...' in k, reqText))
lst1 = ''.join(lst)
numbers = re.findall(r'\d+', lst1)
numbers1 = [x for x in numbers if len(x) > 3]
有什么建议吗?
您可以使用带有模式的拆分:
[^\S\n]+(?=\d{5,7}\b)
说明
[^\S\n]+
匹配 1 个或多个没有换行符的空格(?=\d{5,7}\b)
正面前瞻,断言右侧 5-7 位数字后跟一个单词边界
import re
pattern = r"[^\S\n]+(?=\d{5,7}\b)"
lst = [
"1338516 -...pair - 5pk 1409093 -...re Wax 3Pk",
"1409085 -...dtnr - 5pk 1415090 -...accessories",
"490663 - 3 pack 1490739 -...2 - 3 pack"
]
for s in lst:
print(re.split(pattern, s))
输出
['1338516 -...pair - 5pk', '1409093 -...re Wax 3Pk']
['1409085 -...dtnr - 5pk', '1415090 -...accessories']
['490663 - 3 pack', '1490739 -...2 - 3 pack']
另一种选择可能是匹配方法:
\b\d{5,7}\b.*?(?=[^\S\n]+\d{5,7}\b|$)
您可以使用
^(.+?)\s*\b(\d{5,7}\b.*)
参见regex demo。
在 Python 中,使用原始字符串文字来声明此正则表达式:
pattern = r'^(.+?)\s*\b(\d{5,7}\b.*)'
详情:
^
- 字符串开头(.+?)
- 第 1 组:出现一次或多次(但尽可能少)除换行符以外的任何字符\s*
- 零个或多个空格\b
- 单词边界(\d{5,7}\b.*)
- 第 2 组:five-seven 数字、字边界和该行的其余部分。
看到一个Python demo:
import re
text = "1338516 -...pair - 5pk 1409093 -...re Wax 3Pk"
pattern = r'^(.+?)\s*\b(\d{5,7}\b.*)'
m = re.search(pattern, text)
if m:
print(m.group(1)) # => 1338516 -...pair - 5pk
print(m.group(2)) # => 1409093 -...re Wax 3Pk
如果你需要在Pandas数据框中使用它,你可以使用
df[['result_col_1', 'result_col_2']] = df['source'].str.extract(pattern, expand=True)