正则表达式 - 交换两个短语

时间:2016-08-27 17:38:16

标签: python regex python-3.x

Python 3.每一行由一段文本构成,然后是管道符号,然后是第二段文本。 我想交换两段文字并删除管道。 这是到目前为止的代码:

p = re.compile('^(.*) \| (.*)$', re.IGNORECASE)
mytext = p.sub(r'\2\1', mytext)

但由于某种原因,我无法解决问题,因此无法匹配。 它应该匹配的文本样本(具有讽刺意味):

(https://www.youtube.com/watch?v=NIKdKCQnbNo) | [Regular Expressions 101 - YouTube]

并且最终应该像:

[The Field Expedient Pump Drill - YouTube](https://www.youtube.com/watch?v=4QDXUxTrlRw)

(换句话说,代码将链接格式化为降价转换器的预期格式)。

以下是完整代码:

#! /usr/bin/env python3

import re, os

def create_text(myinputfile):
    with open(myinputfile, 'r', encoding='utf-8') as infile:
        mytext = infile.read()
    return mytext

def reg_replace(mytext):
    p = re.compile('^(.*) \| (.*)$', re.IGNORECASE)
    mytext = p.sub(r'\2\1', mytext)
return mytext

def write_out(mytext, myfinalfile):
    with open(myfinalfile, 'w') as myoutfile:
        myoutfile.write(mytext)

def main():
    mytext = create_text('out.md')
    mytext = reg_replace(mytext)
    write_out(mytext, 'out1.md')
    os.rename("out.md", "out_original.md")
    os.rename("out1.md", "out.md")

main()

2 个答案:

答案 0 :(得分:1)

这应该对你有所帮助。 (在regex101上查看演示)

(\S+)\s*\|\s*(.+)

Sub with:

 \2\1

答案 1 :(得分:0)

抱歉,如果我在这里遗漏了一些内容,但为什么不将re.match与群组而不是re.sub一起使用?:

import re

p = re.compile('^(.*) \| (.*)$', re.IGNORECASE)
sample = "(https://www.youtube.com/watch?v=NIKdKCQnbNo) | [Regular Expressions 101 - YouTube]"

matches = p.search(sample)

new_string = "{0}{1}".format(matches.group(2), matches.group(1))
print(new_string)
>>> [Regular Expressions 101 - YouTube](https://www.youtube.com/watch?v=NIKdKCQnbNo)