我正在创建一个正则表达式,该正则表达式匹配以带有图像扩展名的文件名结尾的网址。基本URL,文件名之前的所有内容,都是动态的。这就是我得到的:
import re
text = 'google.com/dsadasd/dsd.jpg'
dynamic_url = 'google.com/dsadasd'
regex = '{}/(.*)(.gif|.jpg|.jpeg|.tiff|.png)'.format(dynamic_url)
re.search(regex, text)
这可行,但通过,并且应该失败,使用以下URL:
text = 'google.com/dsadasd/.jpg'
只有在图像文件有文件名时才应该匹配。有什么方法可以解释这个吗?
如果这种方法有任何改进,你认为可以使正则表达式捕获我根据初始要求错过的其他边缘情况,def随意说出来。另外,如果有其他方法可以不利用正则表达式,那么这些方法也很受欢迎(也许是一个url解析?)。对我而言,最重要的两件事是性能和清晰度(速度性能最重要)。
答案 0 :(得分:1)
您也可以直接申请os.path.splitext()
:
In [1]: import os
In [2]: text = 'google.com/dsadasd/dsd.jpg'
In [3]: _, extension = os.path.splitext(text)
In [4]: extension
Out[4]: '.jpg'
然后,您可以针对一组受支持的文件扩展名检查extension
。
答案 1 :(得分:0)
你可以试试这个:(.*)(\w+)(.gif|.jpg|.jpeg|.tiff|.png)'
。只需在结尾.whatever
之前添加一些检查。
答案 2 :(得分:0)
你可能会做的是使用锚来断言行的开始protected void INReplenishmentItem_Selected_FieldUpdating(PXCache cache, PXFieldUpdatingEventArgs e)
{
var row = (INReplenishmentItem)e.Row;
if (row == null)
return;
INReplenishmentFilter filter = Base.Filter.Current;
INReplenishmentFilterExt filterExt = PXCache<INReplenishmentFilter>.GetExtension<INReplenishmentFilterExt>(filter);
decimal poAmount = filterExt.UsrPOAmount.HasValue ? filterExt.UsrPOAmount.Value : 0;
decimal lastPrice = pvi.LastPrice.HasValue ? pvi.LastPrice.Value : 0;
decimal newPOAmount = poAmount + lastPrice;
cache.SetValue<INReplenishmentFilterExt.usrPOAmount>(filterExt, newPOAmount);
}
和结束^
或使用单词边界$
要防止在转发\b
斜杠之后匹配例如.jpg
,您可以添加character class并添加要为文件名允许的字符。
在此示例中,我添加了一个或多个单词字符和连字符/
,但您可以根据需要更新
代码的正则表达式部分可能如下所示:
[\w-]+