拆分字符串,直到在 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 位数字后跟一个单词边界

Regex demo

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|$)

Regex demo

您可以使用

^(.+?)\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)