Python正则表达式捕获描述

时间:2020-03-19 15:15:00

标签: python regex

我试图捕获任何一组单词,它们之间只有一个空格,并且可能包含非字母字符。 例如,使用字符串

HOSE 1/4 X BSP F 3/8             Each

我只想获取HOSE 1/4 X BSP F 3/8

我尝试了(?P<descr>(\w+\s)+)模式,但没有成功。同样,有时'/'在那儿,有时它不在。

注意:我正在使用 invoice2data 库从发票中提取订单项,并且需要使用正则表达式。

3 个答案:

答案 0 :(得分:2)

如果不需要正则表达式,则可以使用s.split(' ')[0]轻松获得所需的内容。

如果您需要使用正则表达式,则可以使用

^(?P<descr>\S+(?:\s\S+)*)

请参见regex demo

详细信息

  • ^-字符串的开头
  • \S+-1个以上非空格字符
  • (?:\s\S+)*-单个空格的0次或多次重复,后跟1+个非空格字符。

请参见Python demo

s = "HOSE 1/4 X BSP F 3/8             Each"
print ( s.split('  ')[0] )
# => HOSE 1/4 X BSP F 3/8

import re
m = re.search(r'^(?P<descr>\S+(?:\s\S+)*)', s)
if m:
  print( m.group("descr") )
# => HOSE 1/4 X BSP F 3/8

答案 1 :(得分:1)

很明显,描述可以包含任意文本,因此\w不适用。将描述与该行的其余部分区分开的是一个非常大的空格。在这种情况下,您实际上不需要正则表达式:

line = 'HOSE 1/4 X BSP F 3/8             Each\n'
descr = line.split('   ')[0]

为了安全起见,我在这里使用了三个空格。如果该号码是固定的,并且您是预先知道的,请改用该号码。

由于您似乎需要使用命名捕获组的正则表达式解决方案,因此一种选择是使用正向先行:

(?P<descr>^.+?(?=   ))

+?将在一行的开头对任何字符进行非贪婪捕获,只要它们后面跟随三个或更多空格即可。尾部空格本身未捕获,因为它们由正向超前(?= )检查。

答案 2 :(得分:0)

您可以将此正则表达式与python中的捕获组一起使用:

>>> import re
>>> s = 'HOSE 1/4 X BSP F 3/8        Each'
>>> print (re.findall(r'(?:^\s?|\S\s)(\S+(?: \S+)*)', s))
['HOSE 1/4 X BSP F 3/8']

RegEx Demo

RegEx详细信息:

  • (?:^\s?|\S\s):请确保我们在开始位置或开始后有空格,或者在非空格字符后有空格
  • (\S+(?: \S+)*):匹配1个或多个以单个空格分隔的子字符串
相关问题