我试图捕捉任何一组单词,它们之间只有一个空格,并且可能包含非字母字符。例如,使用字符串
HOSE 1/4 X BSP F 3/8 Each我只想买HOSE 1/4 X BSP F 3/8。
我尝试过(?P<descr>(\w+\s)+)模式,但没有成功。有时'/‘在那里,有时不存在。
注意事项:我使用invoice2data库从发票中获取行项目,并且需要正则表达式。
发布于 2020-03-19 15:28:58
如果不需要regex,那么您可以很容易地通过s.split(' ')[0]获得所需的东西。
如果需要使用正则表达式,则可以使用
^(?P<descr>\S+(?:\s\S+)*)详细信息
^ -字符串的开始\S+ - 1+非空白字符(?:\s\S+)* -0或更多次重复单个空格,然后是1+非空格字符。请参阅Python演示
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发布于 2020-03-19 15:22:35
很明显,描述可以包含任意文本,因此\w不适用。将描述与行的其余部分分开的地方是非常多的空格。在这种情况下,您并不需要regex:
line = 'HOSE 1/4 X BSP F 3/8 Each\n'
descr = line.split(' ')[0]我在这里用了三个空格作为安全的赌注。如果这个号码是固定的,而且你事先就知道了,那就用它代替。
由于您似乎需要使用命名捕获组的regex解决方案,一种选择是使用正面的外观:
(?P<descr>^.+?(?= ))只要字符后面有三个或更多空格,+?就会在行的开头对任何字符进行非贪婪的捕获。尾随空格本身不被捕获,因为它们是由正的前瞻性(?= )检查的。
发布于 2020-03-19 15:20:44
您可以在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或多个由单个空格分隔的子字符串https://stackoverflow.com/questions/60760050
复制相似问题