во второй группе я хочу совместить слова, пока не встретит символ (или>. Но я все же хочу, чтобы он соответствовал словам, даже если у него нет этих символов, как в строках 3 и 4. Я использую Python.
Вы можете совместить конец строки в чередовании:
.*(#\d*\,?\d+)\s.*in\s(.*?)\s*(?=[(>]|$)
Когда вы соответствуете последовательности, которая не должна включать символ, просто используйте набор символов, который инвертирует символы, которые вы не хотите. Я упростил это также на основе ваших примеров. Единственным недостатком является то, что матч будет включать в себя конечные пробелы.
r'.*(#\d*\,?\d+)\s+in\s+([^(>]*)'
>>> for test in tests:
print(re.findall(r'.*(#\d*\,?\d+)\s+in\s+([^(>]*)', test))
[('#26,968', 'Office Products ')]
[('#13,452', 'Industrial & Scientific ')]
[('#99,999', 'baby')]
[('#888', 'office supplies')]
Это может быть не лучший образец и может ловить гораздо больше, но если предоставленный образец является хорошей выборкой данных, у меня есть другой пример:
r"([#\d,]+) in ([\w\s&]+)>?([\w\s&]*)([()\w\s\d]*)"
https://regex101.com/r/hKD6AX/2
Надеюсь это поможет!