正则表达式匹配两个句子相差一个词
Regex that matches two sentences varying by one word
我正在寻找匹配这两个示例的正则表达式:
Hello I am really him.
Hello I am him.
一般来说,如何设置一个既匹配字符串又匹配该字符串中缺少单词的子集的正则表达式?
更新:
所以这只是一个例句,看看我是否可以在我的实际字符串上重现相同的模式。然而,这并不太奏效,所以它们就在这里。
我需要匹配句子:
Ulcerative colitis patient, biopsy taken from the descending colon, macroscopic inflammation vissible
descending
这个词可能存在也可能不存在,no
这个词可能出现在最后一个逗号之后。所以它可能是:
Ulcerative colitis patient, biopsy taken from the descending colon, macroscopic inflammation vissible
Ulcerative colitis patient, biopsy taken from the descending colon, no macroscopic inflammation vissible
Ulcerative colitis patient, biopsy taken from the colon, macroscopic inflammation vissible
Ulcerative colitis patient, biopsy taken from the colon, no macroscopic inflammation vissible
将单词 'really' 和以下 space 设为可选:
/Hello I am (?:really )?him\./
^ ^ group
^ non-matching
^ make the whole group optional
^ escape the '.' so it only matches a literal '.'
对于这个例子,你会想要使用“?”表示可选项目。此外,您需要使用“()”同时使多个字符可选。
这是正则表达式(具体语法可能因您的程序而略有不同):
/Hello I am (really )?him/
egrep 语法示例:
echo "Hello I am him" | egrep "Hello I am (really )?him"
echo "Hello I am really him" | egrep "Hello I am (really )?him"
sed 语法示例:
echo "Hello I am him" | sed "s/Hello I am \(really \)\?him//"
Hello I am (\w*\s?)him.
你可以测试一下here
在问题更新后使用实际字符串和所有测试用例进行编辑:
Ulcerative colitis patient, biopsy taken from the(\s?\w*\s?)colon,(\s?\w*\s?)macroscopic inflammation vissible
这些可以在以下 regex101 link 中验证:regex101.com/r/4QRJDx/3
现有答案涵盖了对问题最明显和最自然的解读。
但是为了兴趣,另一种解释可能是:如何匹配两个句子的序列,与第一个相比,第二个句子最多缺少一个单词?
在这种情况下,您看到的是:
(\w+\b\s*)*?(?:\w+\b\s*)(\w+\b\s*)*[.?!]+[.?!]
三个单词序列(零个或多个;一个;零个或多个);句末标点;然后只有第一个和最后一个单词序列。
虽然效率可能会提高。
我正在寻找匹配这两个示例的正则表达式:
Hello I am really him.
Hello I am him.
一般来说,如何设置一个既匹配字符串又匹配该字符串中缺少单词的子集的正则表达式?
更新:
所以这只是一个例句,看看我是否可以在我的实际字符串上重现相同的模式。然而,这并不太奏效,所以它们就在这里。 我需要匹配句子:
Ulcerative colitis patient, biopsy taken from the descending colon, macroscopic inflammation vissible
descending
这个词可能存在也可能不存在,no
这个词可能出现在最后一个逗号之后。所以它可能是:
Ulcerative colitis patient, biopsy taken from the descending colon, macroscopic inflammation vissible
Ulcerative colitis patient, biopsy taken from the descending colon, no macroscopic inflammation vissible
Ulcerative colitis patient, biopsy taken from the colon, macroscopic inflammation vissible
Ulcerative colitis patient, biopsy taken from the colon, no macroscopic inflammation vissible
将单词 'really' 和以下 space 设为可选:
/Hello I am (?:really )?him\./
^ ^ group
^ non-matching
^ make the whole group optional
^ escape the '.' so it only matches a literal '.'
对于这个例子,你会想要使用“?”表示可选项目。此外,您需要使用“()”同时使多个字符可选。
这是正则表达式(具体语法可能因您的程序而略有不同):
/Hello I am (really )?him/
egrep 语法示例:
echo "Hello I am him" | egrep "Hello I am (really )?him"
echo "Hello I am really him" | egrep "Hello I am (really )?him"
sed 语法示例:
echo "Hello I am him" | sed "s/Hello I am \(really \)\?him//"
Hello I am (\w*\s?)him.
你可以测试一下here
在问题更新后使用实际字符串和所有测试用例进行编辑:
Ulcerative colitis patient, biopsy taken from the(\s?\w*\s?)colon,(\s?\w*\s?)macroscopic inflammation vissible
这些可以在以下 regex101 link 中验证:regex101.com/r/4QRJDx/3
现有答案涵盖了对问题最明显和最自然的解读。
但是为了兴趣,另一种解释可能是:如何匹配两个句子的序列,与第一个相比,第二个句子最多缺少一个单词?
在这种情况下,您看到的是:
(\w+\b\s*)*?(?:\w+\b\s*)(\w+\b\s*)*[.?!]+[.?!]
三个单词序列(零个或多个;一个;零个或多个);句末标点;然后只有第一个和最后一个单词序列。
虽然效率可能会提高。