标签: regex-greedy

.+之间的差异(如果有的话)和.*

我正在查看一些旧的代码库,并且遇到了两个正则表达式部分,我认为它们在语义上是相同的.想知道Stackoverflow社区可以证实我的理解.

RegEx 1 :(.+?) - 一个或多个字符,但可选

RegEx 2:(.*) - 零个或多个字符

我一直在考虑不同的场景,但不能想到任何两个表达式都不相同的输入.

regex regex-greedy

2
推荐指数
1
解决办法
120
查看次数

Python非贪婪的正则表达式并不完全符合我的预期

字符串:XXaaaXXbbbXXcccXXdddOO

我想匹配以 'XX' 开头以 'OO' 结尾最小字符串。

所以我写了非贪婪的reg:r'XX.*?OO'

>>> str = 'XXaaaXXbbbXXcccXXdddOO'
>>> re.findall(r'XX.*?OO', str)
['XXaaaXXbbbXXcccXXdddOO']
Run Code Online (Sandbox Code Playgroud)

我以为它会返回['XXdddOO']但它太“贪婪”了。

然后我知道我一定是弄错了,因为上面的限定符将首先匹配 'XX' 然后显示它是 'non-greedy'。

但我仍然想弄清楚如何直接得到我的结果['XXdddOO']。任何答复表示赞赏。

到目前为止,关键点实际上不是关于 non-greedy ,或者换句话说,它是关于我眼中的 non-greedy:它应该在左限定符(XX?和右限定符()之间匹配尽可能少的字符。 OO).当然事实是字符串是从左到右处理的。

python regex greedy non-greedy regex-greedy

2
推荐指数
1
解决办法
712
查看次数

使用PCRE表达式重写URL - 将前缀附加到除一个模式之外的所有传入URI

我正在使用匹配表达式https://([^/]*)/(.*)并将表达式替换为constantprefix/$ 2并尝试通过向所有URL添加"/ constantprefix"来重写传入的URL

对于以下网址,它按预期工作:

  1. https:// hostname/incomingURI正在转换为/ constantprefix/incomingURI
  2. https:// hostname /正在转换为/ constantprefix/
  3. https://hostname/login/index.aspx正在转换为/constantprefix/login/index.aspx

我对已经以/ constantprefix开头的URL有问题,我在输出URL中看到两个/ constantprefix/constantprefix,我不想找,有什么办法可以避免吗?

如果传入的URL是https://hostname/constantprefix/login/index.aspx,那么输出的URL将变为https://hostname/constantprefix/constantprefix/login/index.aspx 我可以知道如何从匹配中避免/ constantprefix/constantprefix表达?

regex urlrewriter pcre regex-greedy

2
推荐指数
1
解决办法
344
查看次数

2
推荐指数
1
解决办法
3156
查看次数

正则表达式在末尾修复(所有匹配项或无匹配项)为 1

我试图解决.在最后只有一个字符串中。例如,

line = "python...is...fun..."
Run Code Online (Sandbox Code Playgroud)

我有\.*$Ruby 中的正则表达式,它将被替换为单个.,就像在这个演示中一样,它似乎没有按预期工作。我搜索过类似的帖子,我得到的最接近的是Python 中的这个答案,它暗示了以下内容,

>>> text1 = 'python...is...fun...'
>>> new_text = re.sub(r"\.+$", ".", text1)
>>> 'python...is...fun.'
Run Code Online (Sandbox Code Playgroud)

但是,如果我.最后没有,它就会失败。所以,我已经试过像\b\.*$,因为在这里看到,但这未能对具有一定第三测试?在结束的。

我的问题是,为什么\.*$不匹配所有.的(尽管很贪婪)以及如何正确地解决问题?


预期输出:

python...is...fun.
python...is...fun.
python...is...fun??.
Run Code Online (Sandbox Code Playgroud)

ruby python regex substitution regex-greedy

2
推荐指数
1
解决办法
66
查看次数

为什么正则表达式完成3000行的XML文件非常慢?

我注意到Regex用3000行完成XML文件的速度很慢[1]:

\(<Annotation\(\s*\w\+="[^"]\{-}"\s\{-}\)*>\)\@<=\(\(<\/Annotation\)\@!\_.\)\{-}"MATCH\_.\{-}\(<\/Annotation>\)\@=
Run Code Online (Sandbox Code Playgroud)

我一直以为Regexes很有效率.为什么完成正则表达式需要这么长时间?

[1] 如何在VIM中重复匹配A到B?

regex regex-greedy

1
推荐指数
1
解决办法
382
查看次数

正则表达式没有在python中返回预期的输出

名单a = ['Aeroplane','Ramanujan','World-king','Pizza/Burger'] 我想替换的项目(有-,/与列表中)Pizza_BurgerWorld_king.无论符号是什么,都应该用下划线代替.

这是我的代码:

import re
def replaceStrings(arg):
    txt =arg
    res = re.search(r'(?i)\b([a-z][a-z0-9_]*)([/-]+)([a-z][a-z0-9_]*)\b', txt)
    if res:
        pp = reg.sub(r'\1_\2',txt)
        print(pp)
        return pp



for i in a:
    replaceStrings(i)
Run Code Online (Sandbox Code Playgroud)

但我没有得到所需的输出.我的正则表达式有什么问题.我是正则表达式的初学者.谢谢

python regex regex-greedy

1
推荐指数
1
解决办法
51
查看次数

RegEx用于在名字/姓氏之间添加逗号和空格

我有一个姓氏和名字同时出现的名字列表:

BorisovaSvetlana A.; KimHak Joong; PuXiaotao; LiuHung-wen*
Run Code Online (Sandbox Code Playgroud)

我想在姓和名之间添加一个逗号和空格,以使输出为:

Borisova, Svetlana A.; Kim, Hak Joong; Pu, Xiaotao; Liu, Hung-wen*
Run Code Online (Sandbox Code Playgroud)

我在KNIME中使用一个String Manipulation节点,并且我想regexReplace($col1$, ,"")会使用它,也许使用[az]和[AZ]进行某种先行查找以直接在大写字母后写一个小写字母,但是我对regex不熟悉到目前为止,这就是我所拥有的。

我该如何解决这个问题?

regex string regex-group knime regex-greedy

1
推荐指数
1
解决办法
149
查看次数

正则表达式用于匹配Yaml文件

我有包含yaml文件的下一个目录路径:

test/1.yaml
test/dev.yaml
test/dev0_r.yaml 
Run Code Online (Sandbox Code Playgroud)

等等

如何匹配完全在test /目录中但不在子目录(如test / test1 / dev.yaml)中的所有Yaml文件

我正在尝试使用globing:

test/*.yaml 
Run Code Online (Sandbox Code Playgroud)

但在https://regex101.com/上不起作用

我该如何实现?

regex string regex-negation regex-group regex-greedy

1
推荐指数
1
解决办法
75
查看次数

正则表达式捕获未返回预期的数组

我正在尝试使用正则表达式生成一组捕获组,但是捕获组没有捕获我期望的字符串。

我的输入类似于以下常规格式:

S2244060800027008209302B000A667A6201A6828E1976007A000A52820009A3420009B0FE1F
Run Code Online (Sandbox Code Playgroud)

该字符串具有以下组成部分:4个字符的前缀,3个字节的地址,一系列2字节的数据块,1个字节的行终止符。

我只关心地址和数据块。

我尝试使用的正则表达式是: /\w{4}(\w{6})(\w{4})+/;

(在执行正则表达式之前,我有一个使用子字符串解析输入的精巧解决方案,但我讨厌它……)

原始的非功能代码如下:

open IN, "<$ARGV[0]" or die "Could not open '$ARGV[0]': $!\n";
open OUT, ">$ARGV[0].txt" or die "Could not open '$ARGV[0].txt': $!\n";

while (<IN>)
{
    print OUT join(" ",/^\w{4}(\w{6})(\w{4})+/)."\n"; 
}
close IN;
close OUT;
Run Code Online (Sandbox Code Playgroud)

我想要的输出是一个包含以下元素的数组:

@array = [406080, 0027, 0082, 0930, 2B00, 0A66, 7A62, 01A6, 828E, 1976, 007A, 000A, 5282, 0009, A342, 0009, B0FE]
Run Code Online (Sandbox Code Playgroud)

但是前面的正则表达式会导致一个仅包含3个字节地址和最后一个数据块的两个元素数组:

@array = [406080, B0FE]
Run Code Online (Sandbox Code Playgroud)

对我而言,这意味着我对正则表达式捕获组的工作方式有一个基本的误解,我想澄清一下。

仅出于完整性考虑,这是我糟糕的解决方法:

    open IN, "<$ARGV[0]" or die "Could not open '$ARGV[0]': $!\n";    
    open OUT, …
Run Code Online (Sandbox Code Playgroud)

regex perl regex-group regex-greedy

1
推荐指数
1
解决办法
61
查看次数