regex 如何匹配Python正则表达式中的开始和结束?

7gs2gvoe  于 2023-01-21  发布在  Python
关注(0)|答案(7)|浏览(149)

我有一个字符串,我想用一个搜索模式匹配开始 * 和结束 * 处的内容。如何实现呢?
假设我们有一个字符串:

string = "ftp://www.somewhere.com/over/the/rainbow/image.jpg"

我想做这样的事情:

re.search("^ftp:// & .jpg$" ,string)

显然,这是不正确的,但我希望它能让人理解我的观点。这可能吗?

nfs0ujit

nfs0ujit1#

完全不使用正则表达式怎么样?

if string.startswith("ftp://") and string.endswith(".jpg"):

你不觉得这样读起来更好吗?
您还可以支持多个开始和结束选项:

if (string.startswith(("ftp://", "http://")) and 
    string.endswith((".jpg", ".png"))):
3ks5zfa0

3ks5zfa02#

re.match将匹配字符串的开头,与re.search相反:

re.match(r'(ftp|http)://.*\.(jpg|png)$', s)

这里需要注意两点:

  • r''用于字符串字面量,使正则表达式中的反斜杠变得微不足道
  • string是一个标准模块,因此我选择s作为变量
  • 如果多次使用正则表达式,则可以使用r = re.compile(...)构建状态机一次,然后使用r.match(s)匹配字符串

如果需要,还可以使用urlparse模块来解析URL(尽管仍然需要提取扩展名):

>>> allowed_schemes = ('http', 'ftp')
>>> allowed_exts = ('png', 'jpg')
>>> from urlparse import urlparse
>>> url = urlparse("ftp://www.somewhere.com/over/the/rainbow/image.jpg")
>>> url.scheme in allowed_schemes
True
>>> url.path.rsplit('.', 1)[1] in allowed_exts
True
e4eetjau

e4eetjau3#

不要贪心,用^ftp://(.*?)\.jpg$

rekjcdws

rekjcdws4#

试试看

re.search(r'^ftp://.*\.jpg$' ,string)

如果你想用正则表达式搜索。注意你必须转义句点,因为它在正则表达式中有特殊的含义。

jjhzyzn0

jjhzyzn05#

import re

s = "ftp://www.somewhere.com/over/the/rainbow/image.jpg"
print(re.search("^ftp://.*\.jpg$", s).group(0))
e7arh2l6

e7arh2l66#

我想提取所有的数字,包括整型和浮点型。
对我很有效。

import re

s = '[11-09 22:55:41] [INFO ]  [  4560] source_loss: 0.717, target_loss: 1.279, 
transfer_loss:  0.001, total_loss:  0.718'

print([float(s) if '.' in s else int(s) for s in re.findall(r'-?\d+\.?\d*', s)])

参考:https://www.tutorialspoint.com/How-to-extract-numbers-from-a-string-in-Python

fykwrbwg

fykwrbwg7#

我有一个类似的问题,这是我想出的。
如果要查找字符串中的子字符串,可以使用string.find()方法查看子字符串在字符串中的起始位置和结束位置。
理论上,这里应该对代码中所有名为x_text的变量使用相同的变量名,对那些标记为substring_start或substring_end的变量使用相同的变量名。
这将是内存效率更高的方法,但我给它们起了不同的名字,希望尽可能清楚地说明这一点。
令x =一个字符串,它表示要搜索的子字符串的开始,令y =表示该子字符串的结束。

full_text=yourstring

substring_start=full_text.find(x)  
# This will return the index of where your starting indicator first appears in your full string

backend_text=full_text[substring_start:]
# This truncates your string to start only where you indicated

substring_end=backend_text.find(y)
# This will find the index (relative to this backend_string) where your string should end

final_text=backend_text[0:substring_end]

这里有一个工作示例,假设您的字符串是一团乱麻

<article class="product_pod">
<div class="image_container">
<a href="a-light-in-the-attic_1000/index.html"><img alt="A Light in the Attic" class="thumbnail" src="../media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg"/></a>
</div>
<p class="star-rating Three">
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
</p>
<h3><a href="a-light-in-the-attic_1000/index.html" title="A Light in the Attic">A Light in the ...</a></h3>
<div class="product_price">
<p class="price_color">£51.77</p>
<p class="instock availability">
<i class="icon-ok"></i>
    
        In stock
    
</p>
<form>
<button class="btn btn-primary btn-block" data-loading-text="Adding..." type="submit">Add to basket</button>
</form>
</div>
</article>
1
​

下面的代码

title_start=full_text.find("title")
backend_text=full_text[title_start:]
title_end=backend_text.find('">')
final_text=backend_text[0:title_end]

将返回:

'title="A Light in the Attic'

相关问题