我试图捕获任何一组单词,它们之间只有一个空格,并且可能包含非字母字符。 例如,使用字符串
HOSE 1/4 X BSP F 3/8 Each
我只想获取HOSE 1/4 X BSP F 3/8
。
我尝试了(?P<descr>(\w+\s)+)
模式,但没有成功。同样,有时'/'在那儿,有时它不在。
注意:我正在使用 invoice2data 库从发票中提取订单项,并且需要使用正则表达式。
答案 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详细信息:
(?:^\s?|\S\s)
:请确保我们在开始位置或开始后有空格,或者在非空格字符后有空格(\S+(?: \S+)*)
:匹配1个或多个以单个空格分隔的子字符串