标签: backreference

清除正则表达式匹配变量的最佳方法是什么?

清除/重置所有正则表达式匹配变量的最佳方法是什么?


更新:我认为我不需要这样做,但是例子2只是一个例子.这个问题是关于重置匹配变量,而不是实现它们的最佳方法.

无论如何,最初我的编码风格更明确并且使用if-blocks.现在回到这个(例2)之后,阅读许多行代码会更加简洁,我会发现这种语法更容易理解.

regex perl backreference

5
推荐指数
3
解决办法
9158
查看次数

Perl Regex多重匹配

我正在寻找一个表现如下的正则表达式:

输入:"你好世界".

输出:he,el,ll,lo,wo或rl,ld

我的想法是有道理的

    while($string =~ m/(([a-zA-Z])([a-zA-Z]))/g) {
        print "$1-$2 ";
    }
Run Code Online (Sandbox Code Playgroud)

但这确实有点不同.

regex perl backreference

5
推荐指数
2
解决办法
6891
查看次数

正则表达式:对数字进行反向引用,增加它

简单的正则表达式问题:

我想用一个字符串+一些数字(比如10)替换字符串中的页码.我想我可以使用反向引用捕获匹配的页码,对其进行操作并将其用作替换参数re.sub.

这工作(只传递值):

def add_pages(x):
    return x

re.sub("(?<=Page )(\d{2})",add_pages(r"\1") ,'here is Page 11 and here is Page 78\nthen there is Page 65',re.MULTILINE)
Run Code Online (Sandbox Code Playgroud)

屈服,当然, 'here is Page 11 and here is Page 78\nthen there is Page 65'

现在,如果我更改add_pages函数来修改传递的反向引用,我会收到错误.

def add_pages(x):
        return int(x)+10


re.sub("(?<=Page )(\d{2})",add_pages(r"\1") ,'here is Page 11 and here is Page 78\nthen there is Page 65',re.MULTILINE)

ValueError: invalid literal for int() with base 10: '\\1'
Run Code Online (Sandbox Code Playgroud)

,因为传递给add_pages函数的内容似乎是文字反向引用,而不是它引用的内容.

如果没有将所有匹配的数字提取到列表然后处理和添加,我该怎么做?

python regex backreference

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

如何在stringi包中使用反向引用?

在RI中可以\\1用来引用捕获组。但是,在使用stringi软件包时,此操作无法按预期工作。

library(stringi)

fileName <- "hello-you.lst"
(fileName <- stri_replace_first_regex(fileName, "(.*)\\.lst$", "\\1"))

[1] "1"
Run Code Online (Sandbox Code Playgroud)

预期输出:hello-you

文档中,我找不到与该问题有关的任何内容。

backreference r stringi

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

如何在Notepad ++ regexp中使用九个以上的反向引用?

如果我在Notepad ++中使用长正则表达式,即:

^([^ ]+) ([^ ]+) ([^ ]+) (\[.*?\]) (".*?") (".*?") (".*?") (".*?") (\d+) (\d+) (\d+)$
Run Code Online (Sandbox Code Playgroud)

(这是用于将Apache日志行从空格分隔转换为制表符分隔)

然后我无法成功使用超过9个反向引用来替换,因为\10产生了第一个捕获组的内容加上文字"0".

我尝试过$10,但这给出了相同的结果.

regex backreference notepad++ capturing-group

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

匹配相同数量的重复字符作为捕获组的重复

我想清理一些使用python和regex从键盘记录的输入.特别是当使用退格键来修复错误时.

例1:

[in]:  'Helloo<BckSp> world'
[out]: 'Hello world'
Run Code Online (Sandbox Code Playgroud)

这可以通过以下方式完成

re.sub(r'.<BckSp>', '', 'Helloo<BckSp> world')
Run Code Online (Sandbox Code Playgroud)

示例2:
但是当我有几个退格键时,我不知道如何删除完全相同数量的字符:

[in]:  'Helllo<BckSp><BckSp>o world'
[out]: 'Hello world'
Run Code Online (Sandbox Code Playgroud)

(这里我想在两个退格之前删除'l'和'o').

我可以简单地使用re.sub(r'[^>]<BckSp>', '', line)几次,直到没有<BckSp>剩下但我想找到一个更优雅/更快的解决方案.

有谁知道如何做到这一点 ?

python regex backreference

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

如何根据R中分隔符之间的出现替换字符串中的确切字符数

我有这样的文本字符串:

u <- "she goes ~Wha::?~ and he's like ~?Yeah believe me!~ and she's etc."
Run Code Online (Sandbox Code Playgroud)

我想要做的是将成对~分隔符(包括分隔符本身)之间出现的所有字符替换为X.

gsub方法用~单个替换-delimitor 对之间的子字符串X

gsub("~[^~]+~", "X", u)
[1] "she goes X and he's like X and she's etc."
Run Code Online (Sandbox Code Playgroud)

但是,我真正想做的是将分隔符(和分隔符本身)之间的每个字符替换为X. 所需的输出是这样的:

"she goes XXXXXXXXX and he's like XXXXXXXXXXXXXXXXXXX and she's etc."
Run Code Online (Sandbox Code Playgroud)

我一直在试验nchar,反向引用,paste如下,但结果不正确:

gsub("(~[^~]+~)", paste0("X{", nchar("\\1"),"}"), u)
[1] "she goes X{2} and he's like X{2} and she's etc."
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

regex backreference r

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

gsub中的反斜杠(转义和反向引用)

考虑以下代码段:

puts 'hello'.gsub(/.+/, '\0 \\0 \\\0 \\\\0')
Run Code Online (Sandbox Code Playgroud)

打印结果(如ideone.com所示):

hello hello \0 \0
Run Code Online (Sandbox Code Playgroud)

这非常令人惊讶,因为我希望看到这样的东西:

hello \0 \hello \\0
Run Code Online (Sandbox Code Playgroud)

我的观点是,这\是一个转义字符,因此您编写\\以获得一个文字反斜杠,因此\\0是一个文字反斜杠,\后跟0,等等。显然,这不是gsub解释它的方式,因此有人可以解释这是怎么回事吗?

我该怎么做才能得到上面想要的替代品?

ruby regex backreference replace escaping

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

Python 中的命名反向引用 (?P=name) 问题

我正在学习rePython 的“ ”部分,命名模式(?P=name)让我感到困惑,

当我用来re.sub()进行数字和字符的交换时,模式“ (?P=name)”不起作用,但模式“ \N”和“ \g<name>”仍然有意义。代码如下:

[IN]print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'(?P=char)-(?P=digit)', '123-abcd'))
[OUT] (?P=char)-(?P=digit)
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\2-\1', '123-abcd'))
[OUT] abcd-123
[IN] print(re.sub(r'(?P<digit>\d{3})-(?P<char>\w{4})', r'\g<char>-\g<digit>', '123-abcd'))
[OUT] abcd-123
Run Code Online (Sandbox Code Playgroud)

为什么我使用时无法进行替代(?P=name)
以及如何正确使用呢?
我正在使用Python 3.5

python regex backreference python-3.x python-re

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

使用先前的反向引用作为命名捕获组的名称

有没有办法使用对先前捕获组的反向引用作为命名捕获组的名称?这可能是不可能的,如果没有,那么这是一个有效的答案.

下列:

$data = 'description: some description';
preg_match("/([^:]+): (.*)/", $data, $matches);
print_r($matches);
Run Code Online (Sandbox Code Playgroud)

产量:

(
    [0] => description: some description
    [1] => description
    [2] => some description
)
Run Code Online (Sandbox Code Playgroud)

我尝试使用第一个捕获组作为命名捕获组的反向引用(?<$1>.*)告诉我它不可能或者我只是没有正确地执行它:

preg_match("/([^:]+): (?<$1>.*)/", $data, $matches);
Run Code Online (Sandbox Code Playgroud)

产量:

警告:preg_match():编译失败:无法识别的字符(?<在偏移量12处

期望的结果是:

(
    [0] => description: some description
    [1] => description
    [description] => some description
)
Run Code Online (Sandbox Code Playgroud)

这是简化使用preg_match.使用时preg_match_all我通常使用:

$matches = array_combine($matches[1], $matches[2]);
Run Code Online (Sandbox Code Playgroud)

但我想我可能比那更光滑.

php regex backreference pcre regex-group

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