我正在尝试使用python的re模块将字符串中的所有内容匹配到多行注释的结尾。
我目前遇到的字符串是:
[ms]
我正在字符串上执行的搜索如下:
i = 333; ******************/ */
我希望搜索功能能够匹配到tempLine = re.search(r'.*\*/(.*)', line, flags=0).group(1)
首次出现之前的任意数量的字符。
我想使用添加到re的组保存第一个*/
之后的所有内容,并将其保存在变量tempLine中。
正则表达式匹配对象最终如下:
*/
该小组最终以:
<re.Match object; span=(0, 41), match='i = 333; *****************/ */'>
意味着正则表达式将所有匹配到字符串末尾""
的内容匹配,而不是匹配出现在星号之后的第一个*/
。
如何使重新匹配所有匹配项,直到第一次出现*/
为止?
答案 0 :(得分:1)
因为目标是固定的字符串,并且由于您正寻找第一个匹配项,所以您可以考虑使用非re
函数,例如str.partition
。
这将更快,因为它不需要正则表达式处理的开销。
答案 1 :(得分:0)
此表达式
[^/]*/\s+(?=\*/)
使用re.search
,re.match
或re.findall
可能也可以正常工作。
import re
string = "i = 333; ******************/ */"
print(re.search(r"[^/]*/\s+(?=\*/)", string, re.DOTALL).group(0))
print(re.match(r"[^/]*/\s+(?=\*/)", string, re.DOTALL).group(0))
print(re.findall(r"[^/]*/\s+(?=\*/)", string, re.DOTALL))
i = 333; ******************/
i = 333; ******************/
['i = 333; ******************/ ']
如果您想探索/简化/修改表达式,可以 在右上角的面板上进行了说明 regex101.com。如果您愿意, 也可以在this link中观看它的匹配方式 针对一些样本输入。
答案 2 :(得分:0)
您可以将re.search用于:
[^/*]+\*+/(.*)
说明
[^/*]+
匹配除/
或*
以外的任意字符1倍以上\*+/
匹配1次以上*
,然后匹配/
(.*)
捕获 group 1 匹配除换行符0次以上(或(.+)
1次以上)以外的任何字符例如
import re
regex = r"[^/*]+\*+/(.*)"
test_str = "i = 333; ******************/ */python "
matches = re.search(regex, test_str)
if matches:
tempLine = matches.group(1)
print(tempLine)
结果
*/python
答案 3 :(得分:-1)
您可以使用此正则表达式(.*?)\*/
(.*?)
将n个字符分成第1组,?将其设为非贪婪,这意味着当下一个规则为匹配项时,它将停止匹配。
\*/
得到* /
line = 'i = 333; ******************/ */'
tempLine = re.search(r'(.*?)\*/', line, flags=0).group(1)
print(tempLine) # i = 333; *****************