使用Python中的正则表达式在开始或结束时匹配模式

时间:2015-07-19 16:10:23

标签: python regex

我在Python正则表达式方面遇到了困难。我想罚款N,S,E,W,NB,SB,EB,WB,包括在字符串的开头或结尾。我的正则表达式很容易在中间找到它,但在开始或结束时失败。

有人可以告诉我在代码示例下面的dirPattern我做错了吗?

注意:我意识到我还有其他一些问题要处理(例如' W'),但我想我知道如何修改那些正则表达式。

提前致谢。

@Override
public int getItemViewType(int position) {
    return modules.get(position).getType().ordinal();
}

@Override
public ModuleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (types[viewType]) {
        case LINEARLAYOUTSTATBLOCK:
            return new ModuleLLBlockViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.module_block, parent, false));
        case RECYCLERVIEWSTATBLOCK:
            return new ModuleRVBlockViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.module_block, parent, false));
    }
}

@Override
public void onBindViewHolder(ModuleViewHolder vh, final int position) {
    switch (types[vh.getItemViewType()]) {
        case LINEARLAYOUTSTATBLOCK:
            bind((ModuleLLBlockViewHolder) vh, (StatBlockModule) modules.get(position));
            break;
        case RECYCLERVIEWSTATBLOCK:
            bind((ModuleRVBlockViewHolder) vh, (StatBlockModule) modules.get(position));
            break;
    }
}

private void bind(ModuleLLBlockViewHolder vh, TitleTextBlockModule module) {
    for (int i = 0; i < module.getStats().size(); i++) {
        View v = LayoutInflater.from(vh.linearLayout.getContext()).inflate(R.layout.row, vh.linearLayout, true);
        v.setId(i);
        TextView tvCategory = (TextView) v.findViewById(R.id.tvCategory);
        CustomView customView = (CustomView) v.findViewById(R.id.customView);
        tvCategory.setText(stat.getCategory());
        customView.setRating(stat.getRating());
    }
}

private void bind(ModuleRVBlockViewHolder vh, StatBlockModule module) {
    vh.childRecyclerView.setLayoutManager(new LinearLayoutManager(vh.itemView.getContext()));
    vh.childRecyclerView.setAdapter(new ChildAdapter(module.getStats()));
}

一些预期输出样本:

  

名称匹配dirSting方向

     

Boulder Highway和US 95 NB&lt; _sre.SRE_Match对象位于0x7f68af836648&gt; N North

     

Boulder Hwy和US 95 SB&lt; _sre.SRE_Match对象位于0x7f68ae836648&gt; S南

     

Buffalo和Summerlin N&lt; _sre.SRE_Match对象位于0x7f68af826648&gt; N North

     

Charleston和I-215 W&lt; _sre.SRE_Match对象位于0x7f68cf836648&gt; W West

     

火烈鸟和NB I-15&lt; _sre.SRE_Match对象位于0x7f68af8365d0&gt; N North

     

S Buffalo和Summerlin&lt; _sre.SRE_Match对象位于0x7f68aff36648&gt; S南

     

Gibson和I-215 EB&lt; _sre.SRE_Match对象位于0x7f68afa36648&gt; E East

但是,开始或结束示例给出:

  

Boulder Highway和US 95 NB无无无

2 个答案:

答案 0 :(得分:1)

您需要使用lookarounds

dirPattern = re.compile(r'(?<!\S)([NSEW])B?(?!\S)')

[ ^]会匹配空格或插入符号。 (?<!\S)负向后视断言,匹配将在任何机器人之前,而不是非空格字符。 (?!\S)断言他的匹配不能跟一个非空格字符。

为什么我使用否定前瞻而不是积极的方式,python的默认re模块将不支持(?<=^| )

答案 1 :(得分:0)

此代码中的修改后的正则表达式可以解决问题。这包括处理'W of','at E'等类似的东西:

import re

nameList = ['Boulder Highway and US 95 NB',  'Boulder Hwy and US 95 SB', 
'Buffalo and Summerlin N', 'Charleston and I-215 W', 'Eastern and I-215 S', 'Flamingo and NB I-15',
'S Buffalo and Summerlin', 'Flamingo and SB I-15', 'Gibson and I-215 EB', 'I-15 at 3.5 miles N of Jean',
'I-15 NB S I-215 (dual)', 'I-15 SB 4.3 mile N of Primm', 'I-15 SB S of Russell', 'I-515 SB at Eastern W',
'I-580 at I-80 N E', 'I-580 at I-80 S W', 'I-80 at E 4TH St Kietzke Ln', 'I-80 East of W McCarran',
'LV Blvd at I-215 S', 'S Buffalo and I-215 W', 'S Decatur and I-215 WB', 'Sahara and I-15 East',
'Sands and Wynn South Gate', 'Silverado Ranch and I-15 (west side)']

dirMap = {'N': 'North', 'S': 'South', 'E': 'East', 'W': 'West'}

dirPattern = re.compile(r'(?:^| )(?<! at )(?<! of )([NSEW])B?(?! of )(?: |$)')

print('name\tdirSting\tdirection')
for name in nameList:
    match = dirPattern.search(name)
    direction = None
    dirString = None
    if match:
        dirString = match.group(1)
        direction = dirMap.get(dirString)
    print('> %s\t\t%s\t%s'%(name, dirString, direction))

正则表达式可以理解如下:

(?:^| )以字符串开头或空格

开头

(?<! at )之前没有'at'

(?<! of )前面没有'of'

([NSEW])'N','S','E','W'中的任何一个(这将在match.group(1)中)

B?可选地后跟'B'(如绑定中)

(?! of )后面没有'at'

(?: |$)以字符串的一端或空格结束

最终输出是:

  

Boulder Highway和US 95 NB N North

     

Boulder Hwy和US 95 SB S South

     

Buffalo和Summerlin N N North

     

Charleston和I-215 W W West

     

东部和I-215 S S South

     

Flamingo和NB I-15 N North

     

S Buffalo和Summerlin S South

     

Flamingo和SB I-15 S South

     

Gibson和I-215 EB E East

     

I-15在3.5英里N的Jean无无

     

I-15 NB S I-215(双)N北

     

I-15 SB Primm S South 4.3英里N

     

拉塞尔南部的I-15 SB S

     

东南W的I-515 SB

     

I-580在I-80 N E N North

     

I-580在I-80 S W S South

     

I-80在E 4TH St Kietzke Ln无无

     

I-80 W McCarran以东无无

     

I-215 S S South的LV大道

     

S Buffalo和I-215 W S South

     

S Decatur和I-215 WB S South

     

撒哈拉和I-15东无无

     

Sands and Wynn South Gate无无

     

Silverado Ranch和I-15(西侧)无无

旁注:我认为我不想要结束字符串的情况。为此,正则表达式将是:

dirPattern = re.compile(r'(?:^| )(?<! at )(?<! of )([NSEW])B? (?!of )')