【问题标题】:Match 2 strings then print both matches匹配 2 个字符串,然后打印两个匹配项
【发布时间】:2019-12-26 10:26:16
【问题描述】:

我有 2 个要匹配的列表,然后打印列表 A 和列表 B 中的匹配值

 import re

A="""
ABB1265 DUE blah blah 
ADD809 DUE blah blah 
blah ADD blah 
TIME 20:33 ADD223 blah blah. 
"""

B = """
GFA
ADD
ABB
TI
"""



pattern = re.compile("(" + "|".join(i.strip() for i in B.strip().splitlines()) + ")")
for line in A.splitlines():
    line = line.strip()
    m = pattern.match(line)      #Using re.match
    if m:
        print(line,end=",")
        print(m.group(1))

此代码仅匹配行首的单词,并且还包含字符串中的字符串

目前的输出是这样的:

ABB1265 DUE blah blah,ABB
ADD809 DUE blah blah,ADD
TIME 20:33 ADD223 blah blah.,TI

我的理想输出是这样的:

    ABB1265 DUE blah blah,ABB 
    ADD809 DUE blah blah,ADD
    blah ADD blah,ADD
    TIME 20:33 ADD223 blah blah.,ADD

【问题讨论】:

  • 你的意思是 2 个字符串,而不是列表

标签: python regex pattern-matching match


【解决方案1】:

2 种方法:

import re

a = """
ABB1265 DUE blah blah 
ADD809 DUE blah blah 
blah ADD blah 
TIME 20:33 ADD223 blah blah.  
"""

b = """
GFA
ADD
ABB
TI
"""

pat = re.compile(r'({})\d*\b'.format('|'.join(b.split())))

for row in a.splitlines():
    m = pat.search(row)
    if m:
        print(row.strip(), m.group(1), sep=',')

输出:

ABB1265 DUE blah blah,ABB
ADD809 DUE blah blah,ADD
blah ADD blah,ADD
TIME 20:33 ADD223 blah blah.,ADD

或者没有任何正则表达式(用于初始目标字符串):

a = """
ABB1265 DUE blah blah 
ADD809 DUE blah blah 
blah ADD blah 
TIME 20:33 ADD223 blah blah.  
"""

b = """
GFA
ADD
ABB
TI
"""

b_keys = b.split()

for row in a.splitlines():
    for k in b_keys:
        if row.startswith(k):
            print(row.strip(), k, sep=',')
            break

输出:

ABB1265 DUE blah blah,ABB
ADD809 DUE blah blah,ADD
TIME 20:33 ADD223 blah blah.,TI

【讨论】:

  • 谢谢大家,虽然我对这个示例有问题,但代码可以工作,我有代码 TI,我有一个字符串“time blah ABB blah”,它把“时间”这个词当作一个错误的匹配应该采取 ABB
  • @Mohannad,所以不要在 cmets 中写这个 - 用新样本和新结果来改变和纠正你的问题
  • @Mohannad,这就是我的第二种方法所做的,我怀疑你是否测试过它
  • 我测试了它,我的问题是它打印“TI”并留下“ADD”
  • 谢谢,Roman,工作很棒,但有一件事,将 print 语句转换为 output.write 的最佳方法是什么
【解决方案2】:

re 在这里是多余的,简单的str.strip()str.splitlines() 就足够了:

A="""
ABB1265 DUE blah blah
ADD809 DUE blah blah
"""

B="""
ABB
ADD
ARR
AWW
"""

print('\n'.join( ','.join(value) for value in zip(A.strip().splitlines(), B.strip().splitlines()) ))

打印:

ABB1265 DUE blah blah,ABB
ADD809 DUE blah blah,ADD

【讨论】:

    【解决方案3】:

    看起来你需要。

    import re
    
    A="""
    ABB1265 DUE blah blah 
    ADD809 DUE blah blah 
    """
    
    B="""
    ABB
    ADD
    ARR
    AWW
    """
    pattern = re.compile("(" + "|".join(i.strip() for i in B.strip().splitlines()) + ")")
    for line in A.splitlines():
        line = line.strip()
        m = pattern.match(line)      #Using re.match
        if m:
            print(line, m.group(1))
    

    输出:

    'ABB1265 DUE blah blah', 'ABB'
    'ADD809 DUE blah blah', 'ADD'
    

    【讨论】:

    • 它不打印两个值之间的逗号
    • print(", ".join([line, m.group(1)])) ?
    • 谢谢,我做了 2 个单独的打印行,虽然我现在面临另一个问题,请再次检查主题。
    最近更新 更多