在正则表达式字符串搜索之后找到令牌(word)索引的有效方法

时间:2011-05-19 09:07:08

标签: python regex perl string

我需要在另一个字符串y中执行正则表达式搜索字符串x,但是我需要知道使用其他常规字符串标记(拆分)字符串y之后命中的第一个字符的标记(单词)索引表达(例如白色空间)。第一个正则表达式可能会找到一个子字符串,所以我不能保证它会在令牌(word)的开头停止。

实现此目的的最佳算法是什么。一个简单的方法如下:

  1. 使用第一个正则表达式在y中搜索x并获取字符偏移量z
  2. 使用第二个正则表达式
  3. 将y拆分为元素数组
  4. 循环遍历元素数组,将每个项目的长度添加到变量LENGTH并将1添加到计数器COUNTER
  5. 当LENGTH大于或等于z
  6. 时停止循环
  7. 匹配的第一个字符的标记索引将是COUNTER
  8. 的值

    (这假设split函数将分裂字符(例如空格)存储为数组元素,这非常浪费。

    具体(简单)示例:假设我想知道字符串“月亮是由奶酪制成”中搜索“ade”的标记(单词)索引。该函数应该给我回答:3(对于零索引数组)。

    ==编辑==
    当正则表达式搜索跨越标记边界时,该算法也需要工作。例如,在“月亮是由奶酪制成”中搜索“de of ch”时,它应该再次返回索引“3”。

2 个答案:

答案 0 :(得分:1)

根据您的更新:

#!/usr/bin/perl -l
use strict;
use warnings;

my $string = "The moon is made of cheese";
my $search = 'de of ch';
my $pos = index($string, $search);
if ($pos != -1) {
    my $substr = substr($string, 0, $pos);
    my @words = split /\s+/, $substr;
    print "found in word #", $#words, "\n";
} else {
    print "not found\n";
}

<强>输出:

found in word #3

答案 1 :(得分:1)

查找字符串中的第一个模式,然后计算第一个模式之前的字符串部分中第二个模式字符串的出现次数。

以下是执行此任务的perl脚本:

    #!/bin/perl -w

    my $string = 'The moon is made of cheese';
    my $lookedfor = 'de of che';
    my $separator = q/\W+/;

    my $count = undef;
    if ($string =~ /(.*?)$lookedfor/) {
        # Keep the smallest (.*?) part of string before the match.
        my $firstpart = $1;

        $count = 0;
        # Count the number of separator 
        $count++ while $firstpart =~ m/$separator/g;
    }

    if (defined $count) {
        printf "index of '%s' in '%s' is %d\n", $lookedfor, $string, $count;
    } else {
        printf "No occurence of '%s' in '%s'\n", $lookedfor, $string;
    }