首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何匹配python中的regex?

如何匹配python中的regex?
EN

Stack Overflow用户
提问于 2021-06-04 14:42:36
回答 3查看 63关注 0票数 0
代码语言:javascript
复制
describe aws_security_group({:group_id=>"sg-ezsrzerzer", :vpc_id=>"vpc-zfds54zef4s"}) do

我尝试从它中过滤sg-ezsrzerzer (所以我想在start sg-上过滤直到双引号)。我在用蟒蛇

我目前有:

代码语言:javascript
复制
import re
a = 'describe aws_security_group({:group_id=>"sg-ezsrzerzer", :vpc_id=>"vpc-zfds54zef4s"}) do'
test = re.findall(r'\bsg-.*\b', a)
print(test)

输出是

代码语言:javascript
复制
['sg-ezsrzerzer", :vpc_id=>"vpc-zfds54zef4s"}) do']

我怎样才能得到['sg-ezsrzerzer']

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-04 15:59:51

如果目标是提取给定字符串中的group_id值(如您的示例中所示),则模式group_id将很好地工作。

(?<=group_id=\>")在要匹配的字符串之前查找子字符串group_id=>"

.+?匹配任何字符懒惰中的一个或多个字符。

(?=\")在匹配之后查找字符" (实际上使表达式.+匹配除结束"以外的任何字符)。

如果您只想提取group_idsg-开始的子字符串,那么您可以简单地将其添加到模式的匹配部分,如下所示:(?<=group_id=\>")sg\-.+?(?=\")

代码语言:javascript
复制
import re

s = 'describe aws_security_group({:group_id=>"sg-ezsrzerzer", :vpc_id=>"vpc-zfds54zef4s"}) do'

results = re.findall('(?<=group_id=\>").+?(?=\")', s)

print(results)

输出

代码语言:javascript
复制
['sg-ezsrzerzer']

当然,您也可以使用re.search而不是re.findall来查找与给定字符串中的上述模式匹配的子字符串的第一个实例,这取决于您的用例。

代码语言:javascript
复制
import re

s = 'describe aws_security_group({:group_id=>"sg-ezsrzerzer", :vpc_id=>"vpc-zfds54zef4s"}) do'

result = re.search('(?<=group_id=\>").+?(?=\")', s)

if result:
    result = result.group()

print(result)

输出

代码语言:javascript
复制
'sg-ezsrzerzer'

如果您决定使用re.search,您将发现如果输入字符串中没有找到匹配项,则返回None,如果有匹配项,则返回re.Match对象--因此,在上面的示例中,将调用if语句并调用s.group()提取匹配的字符串。

票数 1
EN

Stack Overflow用户

发布于 2021-06-04 20:23:12

模式\bsg-.*\b匹配太多,因为.*将匹配到字符串的末尾,然后返回到第一个单词边界,这是在o和字符串结束之后。

如果您使用的是re.findall,您也可以使用一个捕获组而不是查找器,并且结果中将显示组值。

代码语言:javascript
复制
:group_id=>"(sg-[^"\r\n]+)"

模式匹配:

  • :group_id=>"匹配
  • (sg-[^"\r\n]+)捕获组1匹配sg-和1+乘以除"或换行符以外的任何字符
  • "匹配双引号

regex演示Python演示

例如

代码语言:javascript
复制
import re

pattern = r':group_id=>"(sg-[^"\r\n]+)"'
s = "describe aws_security_group({:group_id=>\"sg-ezsrzerzer\", :vpc_id=>\"vpc-zfds54zef4s\"}) do"

print(re.findall(pattern, s))

输出

代码语言:javascript
复制
['sg-ezsrzerzer']
票数 0
EN

Stack Overflow用户

发布于 2021-06-04 20:49:48

匹配直到第一个单词边界与\w+

代码语言:javascript
复制
import re
a = 'describe aws_security_group({:group_id=>"sg-ezsrzerzer", :vpc_id=>"vpc-zfds54zef4s"}) do'
test = re.findall(r'\bsg-\w+', a)
print(test[0])

Python证明

解释

代码语言:javascript
复制
--------------------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  sg-                      'sg-'
--------------------------------------------------------------------------------
  \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                           more times (matching the most amount
                           possible))

结果g-ezsrzerzer

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67839237

复制
相关文章

相似问题

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