我正在尝试编写一个正则表达式来匹配字符串中两次出现的未知子字符串。
例如:11=11
应该有效,因为11发生两次,中间带有等号。由于ashg=hgasfa
出现两次,hg
也有效。 ' or 1=1 '
应该有效,因为1
出现两次。
更具体地说,在我的项目中,我试图匹配所有字符串数据,其中等号的两边包含相同的字符串。
我记得在修改Apache route files或甚至编写Sublime Text片段时使用$1
或$2
等变量。我该如何实现此功能?我可以写一个像.* $1=$1 .*
这样的正则表达式吗?这甚至可以用Regex完成吗?
答案 0 :(得分:5)
您需要使用反向引用(如\1
)来引用特定组索引中存在的那些字符。
>>> s = 'ashg=hgasfa'
>>> re.search(r'([^=]+)=\1', s)
<_sre.SRE_Match object; span=(2, 7), match='hg=hg'>
>>> re.search(r'([^=]+)=\1', 'ashg=hgasfa').group(1)
'hg'
>>> re.search(r'([^=]+)=\1', '11=11').group(1)
'11'
>>> re.search(r'([^=]+)=\1', ' or 1=1 ').group(1)
'1'
上面的 ([^=]+)
捕获了=
符号之前存在的一个或多个字符(但不是=
符号),然后正则表达式引擎检查是否存在相同的集合=
符号旁边的字符。如果是,则返回匹配对象,否则不返回。