我正在解析包含如下代码的字符串。它可以从一个空行开始,后跟多个可选模式。这些模式可以是python风格的内联注释(使用散列字符),也可以是命令“!mycommand”,两者都必须从一行的开头开始。如何编写与代码开头匹配的正则表达式
mystring = """
# catch this comment
!mycommand
# catch this comment
#catch this comment too
!mycommand
# catch this comment
!mycommand
!mycommand
some code. match until the previous line
# do not catch this comment
!mycommand
# do not catch this comment
"""
import re
pattern = r'^\s*^#.*|!mycommand\s*'
m = re.search(pattern, mystring, re.MULTILINE)
mystring[m.start():m.end()]
mystring = 'code. do not match anything' + mystring
m = re.search(pattern, mystring, re.MULTILINE)
我希望正则表达式将字符串匹配到“some code.catch,直到前一行”。我尝试了不同的方法,但我可能被两种不同的模式困住了
匹配并返回字符串开头的注释
不需要正则表达式,读取并将行追加到列表中,直到出现不以
!
或#
开头的行,并忽略所有空行:见Python demo。结果:
删除字符串开头的注释
输出:
见this Python demo
正则表达式方法
如果行的开头有可选的缩进空格,请添加
[^\S\n]*
:见regex demo和Python demo
count=1
将确保我们只删除第一个匹配项(您不需要检查所有其他行)正则表达式详细信息
^
-字符串的开头(?:[^\S\n]*(?:[!#].*)?\n)+
-1次或多次出现[^\S\n]*
-可选的水平空白(?:[!#].*)?
-一个可选的[!#]
-!
或#
.*
-行的其余部分\n
-换行符李>无需re.MULTILINE即可在匹配前后重复匹配0+个空格字符
Regex demoPython demo
比如说
您的模式匹配
# ...
或!mycommand
的一个实例。解决此问题的一种方法是将所有的匹配项放在一个匹配项中,然后使用re.search
查找第一个匹配项为此,需要使用
*
重复匹配# ...
或!mycommand
的部分:我还将
#.*
更改为#.*\s*
,这样它就一直转到下一行,在那里可以找到非空白Demo
回应你的评论:
您可以尝试:
我改为
\A
,这样它只匹配字符串的绝对开头,而不是行的开头。我还将最后一个*
更改为+
,因此必须至少存在一个# ...
或!mycommand
相关问题 更多 >
编程相关推荐