【问题标题】:Expression up to comment or end of line表达式到注释或行尾
【发布时间】:2009-05-31 20:23:33
【问题描述】:

虽然这个问题类似于this thread

我认为在使用正则表达式构建代码时我可能做错了什么。

我想将一行中的任何内容匹配到注释(“#”)或行尾(如果它没有注释)。

我使用的正则表达式是:(.*)(#|$)

(.*) = 一切
(#|$) = 注释或行尾

代码:

OPTION = re.compile(r'(?P<value>.*)(#|$)')
file = open('file.txt')
lines = file.read()
for line in lines.split('\n'):
    get_match = OPTION.match(line)
    if get_match:
        line_value = get_match.group('value')
        print "Match=  %s" % line_value

上述方法有效,但不会删除评论。 如果文件有这样一行:

this is a line   # and this is a comment

运行代码时我仍然得到整行。

我是否缺少正则表达式中的其他值/信息,还是需要更改代码?

【问题讨论】:

  • 那么第一个#肯定是评论的开始?

标签: python regex


【解决方案1】:

* 是贪婪的(尽可能多地消耗字符串),因此会消耗整行(从 # 到行尾)。改成 ”。*?”它会起作用的。

请参阅Regular Expression HOWTO 了解更多信息。

【讨论】:

  • 我浏览了 RE 模块的文档,但并不像您指出的那样完全理解“贪婪”的解释。感谢您的精彩回答:)
【解决方案2】:

这是执行以下操作的正确正则表达式:

([^#]*)(#.*)?

还有,你为什么不直接使用

file = open('file.txt')
for line in file:

【讨论】:

  • 据我了解,OP 根本不想匹配评论,因此您可以删除正则表达式的第二部分:(#.*)?
【解决方案3】:

@Can、@Benji 和 @ ΤZΩΤZΙΟΥ 提供了三个出色的解决方案,并且很有趣地给它们计时,看看它们的匹配速度有多快(这就是 timeit 的用途——有趣的无意义的微基准测试;-)。例如:

$ python -mtimeit -s'import re; r=re.compile(r"([^#]*)(#.*)?"); s="this is a line   # and this is a comment"' 'm=r.match(s); g=m.group(1)'
100000 loops, best of 3: 2.02 usec per loop

$ python -mtimeit -s'import re; r=re.compile(r"^(.*?)(?:#|$)"); s="this is a line   # and this is a comment"' 'm=r.match(s); g=m.group(1)'
100000 loops, best of 3: 4.19 usec per loop

$ python -mtimeit -s'import re; r=re.compile(r"(.*?)(#|$)"); s="this is a line   # and this is a comment"' 'm=r.match(s); g=m.group(1)'
100000 loops, best of 3: 4.37 usec per loop

获胜者是...混合模式!-)

$ python -mtimeit -s'import re; r=re.compile(r"(.*?)(#.*)?"); s="this is a line   # and this is a comment"' 'm=r.match(s); g=m.group(1)'
1000000 loops, best of 3: 1.73 usec per loop

免责声明:当然,如果这是一个真正的基准测试练习并且速度确实很重要,那么人们会尝试对s 进行许多不同且相关的值,在超出这样一个微基准的测试等等等等。但是,我仍然发现timeit 取之不尽的乐趣!-)

【讨论】:

    【解决方案4】:

    使用这个正则表达式:

    ^(.*?)(?:#|$)
    

    使用非贪婪修饰符 (?),.* 表达式将在达到井号或行尾时匹配为 soon。默认是尽可能匹配 much,这就是为什么你总是得到整行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2010-10-13
      • 2023-03-27
      • 2014-07-26
      • 2021-10-25
      • 1970-01-01
      相关资源
      最近更新 更多