首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获描述的Python regex

捕获描述的Python regex
EN

Stack Overflow用户
提问于 2020-03-19 15:15:00
回答 3查看 105关注 0票数 2

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

代码语言:javascript
复制
HOSE 1/4 X BSP F 3/8             Each

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

我尝试过(?P<descr>(\w+\s)+)模式,但没有成功。有时'/‘在那里,有时不存在。

注意事项:我使用invoice2data库从发票中获取行项目,并且需要正则表达式。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-19 15:28:58

如果不需要regex,那么您可以很容易地通过s.split(' ')[0]获得所需的东西。

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

代码语言:javascript
复制
^(?P<descr>\S+(?:\s\S+)*)

regex演示

详细信息

  • ^ -字符串的开始
  • \S+ - 1+非空白字符
  • (?:\s\S+)* -0或更多次重复单个空格,然后是1+非空格字符。

请参阅Python演示

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-03-19 15:22:35

很明显,描述可以包含任意文本,因此\w不适用。将描述与行的其余部分分开的地方是非常多的空格。在这种情况下,您并不需要regex:

代码语言:javascript
复制
line = 'HOSE 1/4 X BSP F 3/8             Each\n'
descr = line.split('   ')[0]

我在这里用了三个空格作为安全的赌注。如果这个号码是固定的,而且你事先就知道了,那就用它代替。

由于您似乎需要使用命名捕获组的regex解决方案,一种选择是使用正面的外观:

代码语言:javascript
复制
(?P<descr>^.+?(?=   ))

只要字符后面有三个或更多空格,+?就会在行的开头对任何字符进行非贪婪的捕获。尾随空格本身不被捕获,因为它们是由正的前瞻性(?= )检查的。

票数 1
EN

Stack Overflow用户

发布于 2020-03-19 15:20:44

您可以在python中对捕获组使用此正则表达式:

代码语言:javascript
复制
>>> 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演示

RegEx详细信息:

  • (?:^\s?|\S\s):确保我们有开始位置或开始后的空格或非空格字符后面的空格。
  • (\S+(?: \S+)*):匹配1或多个由单个空格分隔的子字符串
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60760050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档