【问题标题】:Python Regular Expression searching backwardsPython正则表达式向后搜索
【发布时间】:2014-01-23 05:00:42
【问题描述】:

我需要从这样的目录中提取一个字符串:

my_new_string = "C:\\Users\\User\\code\\Python\\final\\mega_1237665428090192022_cts.ascii"
ID = '1237665428090192022'
m = re.match(r'.*(\b\w+%s)(?<!.{%d})' % (ID, -1), my_new_string)
if m: print m.group(1)

我需要从上面的my_new_string 中提取“mega”。目前上面只是得到mega_1237665428090192022那么我如何让它忽略ID号?

说实话,即使在查阅文档之后,我也不明白这些表达式是如何工作的。 r' 有什么作用? ?&lt;!.{%d} 是如何工作的?

编辑:谢谢大家!

【问题讨论】:

  • (?&lt;!.{-1}) 应该对什么有用?
  • (?&lt;!...) 如果字符串中的当前位置之前没有匹配 .... 则匹配。这称为否定后向断言。在这种情况下,! 之后的字符 . 表示任何内容,{-1} 应该表示偏移量.. python source, another answer

标签: python regex


【解决方案1】:

有几种方法可以做到这一点,虽然我不确定你是否一定需要一个正则表达式。以下是一些选项:

>>> import os.path
>>> my_new_string = "C:\\Users\\User\\code\\Python\\final\\mega_1237665428090192022_cts.ascii"
>>> os.path.basename(my_new_string)
'mega_1237665428090192022_cts.ascii'
>>> basename = os.path.basename(my_new_string)
>>> basename.split('_')[0]
'mega'
>>> import re
>>> re.match(r'[A-Za-z]+', basename).group()
'mega'

我认为您不是在寻找否定的前瞻断言或否定的后瞻断言。如果有的话,如果数字确实跟随,你想匹配。例如,像这样:

>>> re.match(r'.*?(?=[_\d])', basename).group()
'mega'

r 只是创建一个原始字符串(例如,这样您就不需要经常转义反斜杠)。

【讨论】:

    【解决方案2】:
    >>> m = re.match(r'.*\b(\w+)_(%s)(?<!.{%d})' % (ID, -1), my_new_string)
    >>> m.groups()
    ('mega', '1237665428090192022')
    
    >>> m.group(1)
    'mega'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 2011-12-27
      • 2015-02-23
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多