基于Python中的模式拆分字符串

Tap*_*sal 5 python regex

我有很长的字符串,如

"123 - Footwear, 5678 - Apparel, Accessories & Luxury Goods, 9876 - Leisure Products"

"321 - Apparel & Accessories, 4321 - Apparel & Accessories > Handbags, Wallets & Cases, 187 - Apparel & Accessories > Shoes"

我想根据模式"数字,空格,短划线,空格,一些字符串直到下一个数字,空格,短划线,空格或字符串结尾"来拆分它们.请注意,该字符串可能包含逗号,&符号,">"和其他特殊字符,因此拆分它们将不起作用.我认为Python中有一种方法可以基于正则表达式进行拆分,但是我很难形成.

我对正则表达式有非常介绍性的知识.我可以为数字和字母数字字符串形成一个正则表达式,但我不知道如何指定"在下一个数字开始之前采取一切".


更新:预期输出:

第一种情况:

["123 - Footwear", "5678 - Apparel, Accessories & Luxury Goods", "9876 - Leisure Products"]

第二种情况:

["321 - Apparel & Accessories", "4321 - Apparel & Accessories > Handbags, Wallets & Cases", "187 - Apparel & Accessories > Shoes"]

aka*_*iya 6

这是模式,首先有一些数字,所以我们使用[0-9]+后跟字符串和特殊字符& - >,因此我们可以使用[a-zA-Z \-&>]+:

>>> str_ = "123 - Footwear, 5678 - Apparel, Accessories & Luxury Goods, 9876 - Leisure Products"
>>> re.findall(r'(?is)([0-9]+[a-zA-Z \-&>,]+)', str_)
['123 - Footwear, ',
 '5678 - Apparel, Accessories & Luxury Goods, ',
 '9876 - Leisure Products']
Run Code Online (Sandbox Code Playgroud)

您在OP中提到的另一个字符串

>>> str_ = "321 - Apparel & Accessories, 4321 - Apparel & Accessories > Handbags, Wallets & Cases, 187 - Apparel & Accessories > Shoes"
>>> re.findall(r'(?is)([0-9]+[a-zA-Z \-&>,]+)', str_)
['321 - Apparel & Accessories, ', 
 '4321 - Apparel & Accessories > Handbags, Wallets & Cases, ', 
 '187 - Apparel & Accessories > Shoes']
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 2

您可以匹配以一位或多位数字开头,后跟 1+ 空格、-、 1+ 空格并以相同模式或字符串末尾结尾的子字符串。

re.findall(r"\d+\s+-\s+.*?(?=\s*(?:,\s*)?\d+\s+-\s|\Z)", s, re.S)
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

注意:如果前导数字长度大于 1,例如至少是 2 位数字,您可以将 替换为\d+\d{2,}。根据您的需要进行调整。

正则表达式演示

  • \d+- 1+ 位数字
  • \s+-\s+--包含 1 个以上空格
  • .*?- 任何 0+ 个字符,尽可能少,直到字符串中后跟...的位置
  • (?=\s*(?:,\s*)?\d+\s+-\s|\Z)-(积极的前瞻):
    • \s*(?:,\s*)?\d+\s+-\s- 0+ 个空格、逗号的可选子字符串和其后的 0+ 个空格、1+ 个数字、1+ 个空格-和一个空格
    • | - 或者
    • \Z- 字符串结尾

Python演示

import re

rx = r"\d+\s+-\s+.*?(?=\s*(?:,\s*)?\d+\s+-\s|\Z)"
texts = ["123 - Footwear, 5678 - Apparel, Accessories & Luxury Goods, 9876 - Leisure Products", "321 - Apparel & Accessories, 4321 - Apparel & Accessories > Handbags, Wallets & Cases, 187 - Apparel & Accessories > Shoes"]
for s in texts:
    print("--- {} ----".format(s))
    print(re.findall(rx, s, re.S))
Run Code Online (Sandbox Code Playgroud)

输出:

--- 123 - Footwear, 5678 - Apparel, Accessories & Luxury Goods, 9876 - Leisure Products ---
['123 - Footwear', '5678 - Apparel, Accessories & Luxury Goods', '9876 - Leisure Products']
--- 321 - Apparel & Accessories, 4321 - Apparel & Accessories > Handbags, Wallets & Cases, 187 - Apparel & Accessories > Shoes ---
['321 - Apparel & Accessories', '4321 - Apparel & Accessories > Handbags, Wallets & Cases', '187 - Apparel & Accessories > Shoes']
Run Code Online (Sandbox Code Playgroud)