我在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无无无
答案 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 )')