如何排除其中包含连字符的行? Python(3.6)RE

时间:2018-06-19 01:34:08

标签: regex python-3.x hyphen

从输入中,我想打印出以小写字母(哼声)开头并以0001结尾的行。此外,我想排除那些打印中包含连字符的行(从当前输出中排除最后两行) )。我的猜测是在正则表达式中包含[^ - \ s],这意味着用连字符排除行,但它不起作用。

输入

humabddd001
humhudiwhde001
rehfhfepfhfpehr001oifdjv
iurehfehofewoh001
jfeijjjrefoefojrefoj001
humfiowhewiwihowfhiowfeoewo991
hum0001ofejofrjwoorejfoejfo001
foiwejowjfojfojwofwofjew9032i92i
humifhihweoowhefiwofowfo001
Humerfhofrorr001
HUmhuhdeowhdoewh000001
HUMwifoiewjow001
0001fhdisuhum
hUmfhweoofhwfoh001
humhum001hum
humhumhufih001
humifwje001001
hum30204-439-0942-4029-0001
humouio--hohohoho0001

我的代码

import re
hand = open('D:/Python/Test.txt')
x = hand
for j in x:
     h = re.findall('hum.*\S+001+$',j)
#    h = re.findall('hum+\S+001+$',j)
     if(len(h)>0):
          print(h)

我的当前输出

['humabddd001']
['humhudiwhde001']
['hum0001ofejofrjwoorejfoejfo001'] 
['humifhihweoowhefiwofowfo001']
['humhumhufih001']
['humifwje001001']
['hum30204-439-0942-4029-0001']
['humouio--hohohoho0001']

4 个答案:

答案 0 :(得分:0)

使用此正则表达式:^hum[^-]*001$

输出:

['humabddd001']
['humhudiwhde001']
['hum0001ofejofrjwoorejfoejfo001']
['humifhihweoowhefiwofowfo001']
['humhumhufih001']
['humifwje001001']

答案 1 :(得分:0)

dtmp = pd.merge(df[['a']], df_right.groupby('a').mean().reset_index(drop=False), on='a', how='left')
df['b'] = dtmp['b'].values

正如@Patrick Haugh所说,这不需要正则表达式。正确使用import re hand = open('D:/Python/Test.txt') x = hand for j in x: h = re.findall('^hum[^-]*0001$',j) if(len(h)>0): print(h) startswithendswith将是完美的。

答案 2 :(得分:0)

我根本不会使用正则表达式。您的要求整齐地落在现有的字符串方法中,并且不够复杂,无法使用正则表达式。

with open('Test.txt') as f:
    for line in f:
        line = line.rstrip()
        if line.startswith('hum') and line.endswith('001') and '-' not in line:
            print(line)

打印

humabddd001
humhudiwhde001
hum0001ofejofrjwoorejfoejfo001
humifhihweoowhefiwofowfo001
humhumhufih001
humifwje001001

答案 3 :(得分:0)

问题是您要将否定字符类 [^-\s]添加到已经包含.*的模式中,该模式是与 any 匹配的贪婪点模式> 0个或多个字符(换行符除外)。 .*\S+将匹配换行符以外的任何字符,然后匹配最后一个非空白字符(在这种情况下,+之后的\S是多余的)。

另一个问题是re.findall在字符串内的任意位置 搜索匹配项,但是您只需要在行的开头进行匹配。因此,您需要在模式开始处添加^锚点,或使用re.match方法。

以下是您的解决方法:

results = [j for j in x if re.search(r'^hum[^-\s]*001$', j)]
# => ['humabddd001', 'humhudiwhde001', 'hum0001ofejofrjwoorejfoejfo001', 'humifhihweoowhefiwofowfo001', 'humhumhufih001', 'humifwje001001']

请参见Python demo onlineregex demo

详细信息

  • ^-字符串的开头
  • hum-文字子字符串
  • [^-\s]*-0个或更多-或空格字符
  • 001-一个001文字子串
  • $-字符串的结尾。

正如Patricks所说,除非您想轻松处理所有Unicode空格,否则您实际上并不需要正则表达式 。在这种情况下,您可以使用

no_regex_results = [j for j in x if j.startswith('hum') and j.endswith('001') and '-' not in j and ' ' not in j]

有点长,不能处理Unicode空格。