python重新删除<之间的文本(独家)和最后/(包括)在一条线

时间:2014-03-25 12:18:12

标签: python regex

我正在编写一个python脚本来编辑.cpp和h的库。文件。由于unity3d和iOS本机插件的变幻莫测,我必须完全展平其目录结构。所以我必须浏览所有文件并更改它...(例如)

   #include <Box2D/Dynamics/Joints/b2DistanceJoint.h>

到此..

   #include <b2DistanceJoint.h>

所以我需要一个regex命令来删除&lt;之间的行中的任何文本。和最后一个/并且还删除了最后一个/。如果没有/那么没有任何事情发生(尽管如果需要我可以用if语句来做)

4 个答案:

答案 0 :(得分:3)

使用此正则表达式<.*\/.*\/

REgex Demo

在此验证输出:IDEONE

<强> CODE:

import re

text = """#include <Box2D/Dynamics/Joints/b2DistanceJoint.h>"""
#print text
print re.sub(r'<.*\/.*\/','<',text)

<强>输出:

#include <b2DistanceJoint.h>

答案 1 :(得分:2)

如果您愿意,可以在没有正则表达式的情况下解决此问题,在第一个<字符和最后一个/字符之间进行切片:

>>>s = "#include <Box2D/Dynamics/Joints/b2DistanceJoint.h>"
>>>s[:s.find('<')+1] + s[s.rfind('/')+1:]
'#include <b2DistanceJoint.h>'

当然,也许你偶然发现一条没有任何/的行,在这种情况下我假设你想要保持原样,所以你可以添加一个{{1检查:

if

答案 2 :(得分:2)

试试这个:

code = '''#include <Box2D/Dynamics/Joints/b2DistanceJoint.h>
#include <Box2D/Dynamics/Joints/xyz.h> #include <Box2D/Dynamics/Joints/xyz.h>
#include <pqr.h>'''

code = re.sub("(?:(?<=^)|(?<=[\n\r]))#include\s+<[^>]*/", "#include <", code)

(?:(?<=^)|(?<=[\n\r]))确保#include仅位于该行的开头。因此,它不会触及另一个#include

正则表达式解释:

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    ^                        the beginning of the string
--------------------------------------------------------------------------------
  )                        end of look-behind
--------------------------------------------------------------------------------
 |                        OR
--------------------------------------------------------------------------------
  (?<=                     look behind to see if there is:
--------------------------------------------------------------------------------
    [\n\r]                   any character of: '\n' (newline), '\r'
                             (carriage return)
--------------------------------------------------------------------------------
  )                        end of look-behind

答案 3 :(得分:1)

您接受的正则表达式实际上不适用于以下字符串:

#include <Joints/b2DistanceJoint.h>

regex101 demo

我提出了一个更像这样的正则表达式:

<[^>]*/

regex101 demo

在代码中:

>>> import re
>>> text = """#include <Box2D/Dynamics/Joints/b2DistanceJoint.h>"""
>>> print re.sub(r"<[^>]*/", "<", text)
#include <b2DistanceJoint.h>