不知道實際的形式或位置,這些形式之一可能工作(未經測試):
s{\[S (\w+)#/\w+\] (\[VP)(\w+/\w+\])}{$2$1$3}g
或
s{\[(?:S/VP) (\w+)#/\w+\] (\[(?:S/VP))(\w+/\w+\])}{$2$1$3}g
或
s{\[(?:S/VP)\s+(\w+)#/\w+\]\s+(\[(?:S/VP)\s+)(\w+/\w+\])}{$2$1$3}g
編輯 由於您的修改已列入這種模式
[ <label> w#/<label>] [<label> <word>/<label> <word>/<label> <word>/<label>...]
它可以更容易地拿出一個正則表達式,應該工作。
祝你好運!
use strict;
use warnings;
$/ = undef;
my $data = <DATA>;
my $regex = qr{
\[\s* #= Start of token phrase '['
(?&label) \s+ # <label> then whitespace's
((?&word)) # Capture $1 - token word, end grp $1
[#]/(?&label) # '#'/<label>
\s*
\] #= End of token phrase ']'
\s*
( # Capture grp $2
\[\s* #= Start of normal phrase '['
(?&label) \s+ # <label> then whitespace's
) # End grp $2
( # Capture grp $3
(?&word)/(?&label) # First <word>/<label> pair
(?:
\s+(?&word)/(?&label) # Optional, many <word>/<label> pair's
)*
\s*
\] #= End of normal phrase ']'
) # End grp $3
(?(DEFINE) ## DEFINE's:
(?<label> \w+) # <label> - 1 or more word characters
(?<word> [^\s\[\]]+) # <word> - 1 or more NOT whitespace, '[' nor ']'
)
}x;
$data =~ s/$regex/$2$1$3/g;
print $data;
__DATA__
[S w#/CC] [VP mSf/VBD_MS3]
輸出:
[VP wmSf/VBD_MS3]
EDIT2
「如果字符的標籤是PP,如果下一個樂句的標籤是NP,然後更改下一個樂句的標籤,PP以及當輸入:[PP w#/ IN] [NP something/NN]輸出:[PP wsomething/NN]「
當然,如果不添加太多的新捕獲組,它可以通過回調。
其實,有很多方法可以做到這一點,包括正則表達式條件。我認爲最簡單的方法是回調,其中可以進行所有標籤決策的邏輯。
use strict;
use warnings;
$/ = undef;
my $data = <DATA>;
my $regex = qr{
(\[\s* # 1 - Token phrase label
(?&label)
\s+
)
( # 2 - Token word
(?&word)
)
[#]/(?&label)
\s*
\]
\s*
(\[\s* # 3 - Normal phrase label
(?&label)
\s+
)
# insert token word ($2) here
( # 4 - The rest ..
(?&word)/(?&label)
(?: \s+ (?&word)/(?&label))*
\s*
\]
)
(?(DEFINE) ## DEFINE's:
(?<label> \w+) # <label> - 1 or more word characters
(?<word> [^\s\[\]]+) # <word> - 1 or more NOT whitespace, '[' nor ']'
)
}x;
$data =~ s/$regex/ checkLabel($1,$3) ."$2$4"/eg;
sub checkLabel
{
my ($p1, $p2) = @_;
if ($p1 =~ /\[\s*PP\s/ && $p2 =~ /(\[\s*)NP(\s)/) {
return $1.'PP'.$2;
# To use the formatting of the token label, just 'return $p1;'
}
return $p2;
}
print $data;
__DATA__
[PP w#/CC] [ NP mSf/VBD_MS3]
來源
2011-11-15 18:18:11
sln
你提到很多短語,你可以給你的目標的普通描述,而不是兩個短語的例子 – SAN
散列符號是否真的是第一個短語的一部分?說明中沒有提及它。 – choroba
是的,散列是該短語的一部分。但是當我在第二個短語中附加w時,我不需要它。 – user961627